@@ -89,10 +89,12 @@ static bool IsArrayFieldPtr(clang::ASTContext &ctx, const clang::Expr *expr) {
8989// Whether `expr` is a field of an element of a std::vector, whose arrays and
9090// vectors are accessed through the place of the element, which is never
9191// reinterpreted memory.
92- static bool IsFieldOfVectorElem (const clang::MemberExpr *expr) {
92+ static bool IsFieldOfVectorElem (clang::ASTContext &ctx,
93+ const clang::MemberExpr *expr) {
9394 auto *op = clang::dyn_cast<clang::CXXOperatorCallExpr>(
9495 expr->getBase ()->IgnoreParenImpCasts ());
95- return !expr->isArrow () && op && op->getOperator () == clang::OO_Subscript;
96+ return !expr->isArrow () && op && op->getOperator () == clang::OO_Subscript &&
97+ !Mapper::Contains (ctx, op);
9698}
9799
98100static bool IsPointerType (clang::ASTContext &ctx, clang::QualType type) {
@@ -174,7 +176,7 @@ bool ConverterRefCount::IsUnboxedPlace(const clang::Expr *expr) const {
174176 }
175177 if (auto *op = clang::dyn_cast<clang::CXXOperatorCallExpr>(expr)) {
176178 return op->getOperator () == clang::OO_Subscript &&
177- IsUnboxedPlace (op->getArg (0 ));
179+ ! Mapper::Contains (ctx_, op) && IsUnboxedPlace (op->getArg (0 ));
178180 }
179181 auto *ref = clang::dyn_cast<clang::DeclRefExpr>(expr);
180182 return ref && IsUnboxedVar (ref->getDecl ());
@@ -2956,7 +2958,7 @@ std::string ConverterRefCount::ConvertElemPlace(clang::Expr *container,
29562958 !IsUnboxedPlace (member) &&
29572959 Mapper::Map (ctx_, field->getType ().getUnqualifiedType ())
29582960 .starts_with (" Vec<" )) {
2959- if (IsFieldOfVectorElem (member)) {
2961+ if (IsFieldOfVectorElem (ctx_, member)) {
29602962 return std::format (" index!({}, {})" , ConvertPlace (member),
29612963 ConvertSubscriptIndex (idx));
29622964 }
@@ -3097,7 +3099,7 @@ void ConverterRefCount::ConvertPointerElem(clang::Expr *base,
30973099 // An element of an array field is accessed in place, through the struct.
30983100 if (IsArrayFieldPtr (ctx_, base)) {
30993101 auto *member = clang::cast<clang::MemberExpr>(base->IgnoreParenImpCasts ());
3100- if (IsFieldOfVectorElem (member)) {
3102+ if (IsFieldOfVectorElem (ctx_, member)) {
31013103 StrCat (std::format (" index!({}, {})" , ConvertPlace (member),
31023104 ConvertRValue (idx)));
31033105 computed_expr_type_ = ComputedExprType::FreshPointer;
0 commit comments