@@ -1506,10 +1506,6 @@ bool ConverterRefCount::VisitImplicitCastExpr(clang::ImplicitCastExpr *expr) {
15061506 ToString (sub_expr->IgnoreParens ())));
15071507 computed_expr_type_ = ComputedExprType::FreshPointer;
15081508 return false ;
1509- } else if (auto ptr = ConvertArrayPointerDeref (sub_expr); !ptr.empty ()) {
1510- StrCat (ptr);
1511- computed_expr_type_ = ComputedExprType::FreshPointer;
1512- return false ;
15131509 } else {
15141510 // we need to write (var.as_pointer as Ptr<T>) because Rust isn't
15151511 // smart enough to pick the right specialization
@@ -2580,9 +2576,6 @@ std::string ConverterRefCount::ConvertVarInitValue(clang::QualType qual_type,
25802576 return std::format (" Ptr::<{}>::from_string_literal({})" , code_unit,
25812577 ToString (expr->IgnoreParens ()->IgnoreImplicit ()));
25822578 }
2583- if (auto ptr = ConvertArrayPointerDeref (expr); !ptr.empty ()) {
2584- return ptr;
2585- }
25862579 }
25872580 return ConvertFreshPointer (expr, qual_type);
25882581 }
@@ -3046,6 +3039,9 @@ void ConverterRefCount::ConvertPointerSubscript(
30463039 ConvertPointerElem (base, idx);
30473040 } else {
30483041 ConvertPointerOffset (base, idx);
3042+ if (expr->getType ()->isArrayType ()) {
3043+ StrCat (GetPointerDerefSuffix (expr->getType ()), " .as_pointer()" );
3044+ }
30493045 }
30503046 if (deref) {
30513047 StrCat (GetPointerDerefSuffix (expr->getType ()));
@@ -3127,6 +3123,11 @@ void ConverterRefCount::ConvertDeref(clang::Expr *expr) {
31273123 str = std::move (buf).str ();
31283124 }
31293125
3126+ if (isAddrOf () && pointee_type->isArrayType ()) {
3127+ str = std::format (" ({}){}.as_pointer()" , std::move (str),
3128+ GetPointerDerefSuffix (pointee_type));
3129+ }
3130+
31303131 if (isObject () && WantsElementPtr () &&
31313132 (IsBoxedType (ctx_, pointee_type) || pointee_type->isArrayType ())) {
31323133 StrCat (std::format (" Ptr::<{}>::decay(&({}))" , ToString (pointee_type),
@@ -3199,18 +3200,6 @@ bool ConverterRefCount::DerefReadsValue(clang::QualType pointee_type) {
31993200 return pointee_type.isPODType (ctx_) && !pointee_type->isRecordType ();
32003201}
32013202
3202- std::string ConverterRefCount::ConvertArrayPointerDeref (clang::Expr *expr) {
3203- auto *op =
3204- clang::dyn_cast<clang::UnaryOperator>(expr->IgnoreParenNoopCasts (ctx_));
3205- if (!op || op->getOpcode () != clang::UO_Deref ||
3206- !op->getType ()->isArrayType ()) {
3207- return {};
3208- }
3209- PushConversionKind push (*this , ConversionKind::Unboxed);
3210- return std::format (" ({}{}.as_pointer())" , ConvertRValue (op->getSubExpr ()),
3211- GetPointerDerefSuffix (op->getType ()));
3212- }
3213-
32143203const char *
32153204ConverterRefCount::GetPointerDerefSuffix (clang::QualType pointee_type) {
32163205 return DerefReadsValue (pointee_type) ? " .read()" : " .upgrade().deref()" ;
0 commit comments