Skip to content

Commit ec1918a

Browse files
committed
Check mapper
1 parent eeca783 commit ec1918a

1 file changed

Lines changed: 7 additions & 5 deletions

File tree

‎cpp2rust/converter/models/converter_refcount.cpp‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

98100
static 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

Comments
 (0)