@@ -2165,7 +2165,7 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(
21652165 pending_deref_.set (std::format (" ({} as {}).offset({})" ,
21662166 ConvertObject (expr->getArg (0 )),
21672167 ConvertPtrType (expr->getArg (0 )->getType ()),
2168- ConvertRValue (expr->getArg (1 ))),
2168+ ConvertSubscriptIndex (expr->getArg (1 ))),
21692169 expr);
21702170 break ;
21712171 }
@@ -2185,7 +2185,7 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(
21852185 StrCat (std::format (" ({} as {}).offset({})" ,
21862186 ConvertObject (expr->getArg (0 )),
21872187 ConvertPtrType (expr->getArg (0 )->getType ()),
2188- ConvertRValue (expr->getArg (1 ))));
2188+ ConvertSubscriptIndex (expr->getArg (1 ))));
21892189
21902190 if (is_inner_boxed) {
21912191 StrCat (GetPointerDerefSuffix (expr->getType ()), " .as_pointer()" );
@@ -2220,6 +2220,14 @@ void ConverterRefCount::ConvertFunctionParameters(clang::FunctionDecl *decl) {
22202220 }
22212221}
22222222
2223+ std::string ConverterRefCount::ConvertSubscriptIndex (clang::Expr *idx) {
2224+ auto str = ConvertRValue (idx);
2225+ if (idx->getType ()->isEnumeralType ()) {
2226+ return std::format (" ({}) as isize" , str);
2227+ }
2228+ return str;
2229+ }
2230+
22232231void ConverterRefCount::ConvertArraySubscript (clang::Expr *base,
22242232 clang::Expr *idx,
22252233 clang::QualType type) {
@@ -2236,12 +2244,12 @@ void ConverterRefCount::ConvertArraySubscript(clang::Expr *base,
22362244 if (IsStringLiteralExpr (base)) {
22372245 StrCat (std::format (" Ptr::from_string_literal({}).offset({})" ,
22382246 ToString (base->IgnoreParens ()->IgnoreImplicit ()),
2239- ConvertRValue (idx)));
2247+ ConvertSubscriptIndex (idx)));
22402248 } else {
22412249 StrCat (std::format (" ({} as {}).offset({})" ,
22422250 ToString (base->IgnoreImplicit ()),
22432251 ConvertPtrType (base->IgnoreImplicit ()->getType ()),
2244- ConvertRValue (idx)));
2252+ ConvertSubscriptIndex (idx)));
22452253 }
22462254
22472255 if (is_inner_boxed) {
0 commit comments