@@ -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 ());
@@ -2810,20 +2810,6 @@ void ConverterRefCount::ConvertGenericBinaryOperator(
28102810 computed_expr_type_ = ComputedExprType::FreshValue;
28112811}
28122812
2813- void ConverterRefCount::ConvertUniquePtrDeref (
2814- clang::CXXOperatorCallExpr *expr) {
2815- if (isAddrOf ()) {
2816- StrCat (ConvertRValue (expr->getArg (0 )), " .as_pointer()" );
2817- computed_expr_type_ = ComputedExprType::FreshPointer;
2818- } else {
2819- // The object is modified through its own Value.
2820- StrCat (std::format (" (*{}.as_ref().unwrap().borrow{}())" ,
2821- ConvertRValue (expr->getArg (0 )),
2822- isRValue () ? " " : " _mut" ));
2823- SetValueFreshness (expr->getType ());
2824- }
2825- }
2826-
28272813bool ConverterRefCount::ConvertCXXOperatorCallExpr (
28282814 clang::CXXOperatorCallExpr *expr) {
28292815 switch (expr->getOperator ()) {
@@ -2833,11 +2819,6 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(
28332819
28342820 case clang::OverloadedOperatorKind::OO_Arrow:
28352821 case clang::OverloadedOperatorKind::OO_Star:
2836- if (IsUniquePtr (expr->getArg (0 )->getType ())) {
2837- ConvertUniquePtrDeref (expr);
2838- break ;
2839- }
2840-
28412822 if (isLValue ()) {
28422823 auto ptr = ToString (expr->getArg (0 ));
28432824 pending_deref_.set (std::move (ptr), isFresh ());
@@ -2859,24 +2840,6 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(
28592840 break ;
28602841
28612842 case clang::OverloadedOperatorKind::OO_Subscript: {
2862- if (IsUniquePtr (expr->getArg (0 )->getType ())) {
2863- StrCat (
2864- std::format (" {}.as_ref().unwrap()" , ConvertRValue (expr->getArg (0 ))));
2865- if (isAddrOf ()) {
2866- StrCat (std::format (" .as_pointer().offset(({}))" ,
2867- ConvertRValue (expr->getArg (1 ))));
2868- } else {
2869- if (isRValue ()) {
2870- StrCat (" .borrow()" );
2871- } else {
2872- StrCat (" .borrow_mut()" );
2873- }
2874- StrCat (std::format (" [({}) as usize]" , ConvertRValue (expr->getArg (1 ))));
2875- }
2876- SetValueFreshness (expr->getType ());
2877- break ;
2878- }
2879-
28802843 bool is_inner_boxed =
28812844 IsBoxedType (ctx_, expr->getType ().getNonReferenceType ()) &&
28822845 IsBoxedType (ctx_, expr->getArg (0 )->getType ().getNonReferenceType ());
@@ -2994,7 +2957,7 @@ std::string ConverterRefCount::ConvertElemPlace(clang::Expr *container,
29942957 !IsUnboxedPlace (member) &&
29952958 Mapper::Map (ctx_, field->getType ().getUnqualifiedType ())
29962959 .starts_with (" Vec<" )) {
2997- if (IsFieldOfVectorElem (member)) {
2960+ if (IsFieldOfVectorElem (ctx_, member)) {
29982961 return std::format (" index!({}, {})" , ConvertPlace (member),
29992962 ConvertSubscriptIndex (idx));
30002963 }
@@ -3135,7 +3098,7 @@ void ConverterRefCount::ConvertPointerElem(clang::Expr *base,
31353098 // An element of an array field is accessed in place, through the struct.
31363099 if (IsArrayFieldPtr (ctx_, base)) {
31373100 auto *member = clang::cast<clang::MemberExpr>(base->IgnoreParenImpCasts ());
3138- if (IsFieldOfVectorElem (member)) {
3101+ if (IsFieldOfVectorElem (ctx_, member)) {
31393102 StrCat (std::format (" index!({}, {})" , ConvertPlace (member),
31403103 ConvertRValue (idx)));
31413104 computed_expr_type_ = ComputedExprType::FreshPointer;
0 commit comments