@@ -89,11 +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 ());
9596 return !expr->isArrow () && op && op->getOperator () == clang::OO_Subscript &&
96- !IsUniquePtr (op-> getArg ( 0 )-> getType () );
97+ !Mapper::Contains (ctx, op );
9798}
9899
99100static bool IsPointerType (clang::ASTContext &ctx, clang::QualType type) {
@@ -175,8 +176,7 @@ bool ConverterRefCount::IsUnboxedPlace(const clang::Expr *expr) const {
175176 }
176177 if (auto *op = clang::dyn_cast<clang::CXXOperatorCallExpr>(expr)) {
177178 return op->getOperator () == clang::OO_Subscript &&
178- !IsUniquePtr (op->getArg (0 )->getType ()) &&
179- IsUnboxedPlace (op->getArg (0 ));
179+ !Mapper::Contains (ctx_, op) && IsUnboxedPlace (op->getArg (0 ));
180180 }
181181 auto *ref = clang::dyn_cast<clang::DeclRefExpr>(expr);
182182 return ref && IsUnboxedVar (ref->getDecl ());
@@ -2811,20 +2811,6 @@ void ConverterRefCount::ConvertGenericBinaryOperator(
28112811 computed_expr_type_ = ComputedExprType::FreshValue;
28122812}
28132813
2814- void ConverterRefCount::ConvertUniquePtrDeref (
2815- clang::CXXOperatorCallExpr *expr) {
2816- if (isAddrOf ()) {
2817- StrCat (ConvertRValue (expr->getArg (0 )), " .as_pointer()" );
2818- computed_expr_type_ = ComputedExprType::FreshPointer;
2819- } else {
2820- // The object is modified through its own Value.
2821- StrCat (std::format (" (*{}.as_ref().unwrap().borrow{}())" ,
2822- ConvertRValue (expr->getArg (0 )),
2823- isRValue () ? " " : " _mut" ));
2824- SetValueFreshness (expr->getType ());
2825- }
2826- }
2827-
28282814bool ConverterRefCount::ConvertCXXOperatorCallExpr (
28292815 clang::CXXOperatorCallExpr *expr) {
28302816 switch (expr->getOperator ()) {
@@ -2834,11 +2820,6 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(
28342820
28352821 case clang::OverloadedOperatorKind::OO_Arrow:
28362822 case clang::OverloadedOperatorKind::OO_Star:
2837- if (IsUniquePtr (expr->getArg (0 )->getType ())) {
2838- ConvertUniquePtrDeref (expr);
2839- break ;
2840- }
2841-
28422823 if (isLValue ()) {
28432824 auto ptr = ToString (expr->getArg (0 ));
28442825 pending_deref_.set (std::move (ptr), isFresh ());
@@ -2860,24 +2841,6 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(
28602841 break ;
28612842
28622843 case clang::OverloadedOperatorKind::OO_Subscript: {
2863- if (IsUniquePtr (expr->getArg (0 )->getType ())) {
2864- StrCat (
2865- std::format (" {}.as_ref().unwrap()" , ConvertRValue (expr->getArg (0 ))));
2866- if (isAddrOf ()) {
2867- StrCat (std::format (" .as_pointer().offset(({}))" ,
2868- ConvertRValue (expr->getArg (1 ))));
2869- } else {
2870- if (isRValue ()) {
2871- StrCat (" .borrow()" );
2872- } else {
2873- StrCat (" .borrow_mut()" );
2874- }
2875- StrCat (std::format (" [({}) as usize]" , ConvertRValue (expr->getArg (1 ))));
2876- }
2877- SetValueFreshness (expr->getType ());
2878- break ;
2879- }
2880-
28812844 bool is_inner_boxed =
28822845 IsBoxedType (ctx_, expr->getType ().getNonReferenceType ()) &&
28832846 IsBoxedType (ctx_, expr->getArg (0 )->getType ().getNonReferenceType ());
@@ -2995,7 +2958,7 @@ std::string ConverterRefCount::ConvertElemPlace(clang::Expr *container,
29952958 !IsUnboxedPlace (member) &&
29962959 Mapper::Map (ctx_, field->getType ().getUnqualifiedType ())
29972960 .starts_with (" Vec<" )) {
2998- if (IsFieldOfVectorElem (member)) {
2961+ if (IsFieldOfVectorElem (ctx_, member)) {
29992962 return std::format (" index!({}, {})" , ConvertPlace (member),
30002963 ConvertSubscriptIndex (idx));
30012964 }
@@ -3136,7 +3099,7 @@ void ConverterRefCount::ConvertPointerElem(clang::Expr *base,
31363099 // An element of an array field is accessed in place, through the struct.
31373100 if (IsArrayFieldPtr (ctx_, base)) {
31383101 auto *member = clang::cast<clang::MemberExpr>(base->IgnoreParenImpCasts ());
3139- if (IsFieldOfVectorElem (member)) {
3102+ if (IsFieldOfVectorElem (ctx_, member)) {
31403103 StrCat (std::format (" index!({}, {})" , ConvertPlace (member),
31413104 ConvertRValue (idx)));
31423105 computed_expr_type_ = ComputedExprType::FreshPointer;
0 commit comments