@@ -300,7 +300,8 @@ std::string ConverterRefCount::ConvertObject(clang::Expr *expr,
300300 auto pointee = expr->getType ()->getPointeeType ();
301301 if (IsBoxedType (pointee) || pointee->isArrayType ()) {
302302 computed_expr_type_ = ComputedExprType::FreshPointer;
303- return std::format (" {}.decay()" , std::move (str));
303+ return std::format (" Ptr::<{}>::decay(&({}))" , ToString (pointee),
304+ std::move (str));
304305 }
305306 }
306307 return str;
@@ -872,8 +873,10 @@ bool ConverterRefCount::VisitDeclRefExpr(clang::DeclRefExpr *expr) {
872873 return false ;
873874 }
874875
875- if (isObject () && WantsElementPtr () && IsBoxedType (ref->getPointeeType ())) {
876- StrCat (str, " .decay()" );
876+ if (auto pointee = ref->getPointeeType ();
877+ isObject () && WantsElementPtr () && IsBoxedType (pointee)) {
878+ StrCat (std::format (" Ptr::<{}>::decay(&({}))" , ToString (pointee),
879+ std::move (str)));
877880 computed_expr_type_ = ComputedExprType::FreshPointer;
878881 return false ;
879882 }
@@ -1162,7 +1165,8 @@ bool ConverterRefCount::VisitCallExpr(clang::CallExpr *expr) {
11621165
11631166 if (isObject () && WantsElementPtr () && ref &&
11641167 IsBoxedType (ref->getPointeeType ())) {
1165- StrCat (std::format (" {}.decay()" , std::move (str)));
1168+ StrCat (std::format (" Ptr::<{}>::decay(&({}))" ,
1169+ ToString (ref->getPointeeType ()), std::move (str)));
11661170 computed_expr_type_ = ComputedExprType::FreshPointer;
11671171 return false ;
11681172 }
@@ -2623,24 +2627,32 @@ void ConverterRefCount::ConvertDeref(clang::Expr *expr) {
26232627 return ;
26242628 }
26252629
2630+ std::string str;
26262631 {
2632+ Buffer buf (*this );
26272633 bool deref = !isAddrOf ();
2628- PushParen paren (*this , deref);
2629- if (deref) {
2630- StrCat (GetPointerDerefPrefix (pointee_type));
2631- }
2632- Convert (expr);
2633- if (deref) {
2634- StrCat (GetPointerDerefSuffix (pointee_type));
2635- SetValueFreshness (pointee_type);
2634+ {
2635+ PushParen paren (*this , deref);
2636+ if (deref) {
2637+ StrCat (GetPointerDerefPrefix (pointee_type));
2638+ }
2639+ Convert (expr);
2640+ if (deref) {
2641+ StrCat (GetPointerDerefSuffix (pointee_type));
2642+ SetValueFreshness (pointee_type);
2643+ }
26362644 }
2645+ str = std::move (buf).str ();
26372646 }
26382647
26392648 if (isObject () && WantsElementPtr () &&
26402649 (IsBoxedType (pointee_type) || pointee_type->isArrayType ())) {
2641- StrCat (" .decay()" );
2650+ StrCat (std::format (" Ptr::<{}>::decay(&({}))" , ToString (pointee_type),
2651+ std::move (str)));
26422652 computed_expr_type_ = ComputedExprType::FreshPointer;
2653+ return ;
26432654 }
2655+ StrCat (std::move (str));
26442656}
26452657
26462658void ConverterRefCount::ConvertArrow (clang::Expr *expr) {
0 commit comments