@@ -129,6 +129,7 @@ bool ConverterRefCount::NeedsMut(const clang::VarDecl *decl,
129129std::string ConverterRefCount::BoxType (std::string &&str) const {
130130 switch (getConversionKind ()) {
131131 case ConversionKind::Unboxed:
132+ case ConversionKind::Pointee:
132133 case ConversionKind::Ptr:
133134 return std::move (str);
134135 case ConversionKind::FullRefCount:
@@ -140,6 +141,7 @@ std::string ConverterRefCount::BoxType(std::string &&str) const {
140141std::string ConverterRefCount::BoxValue (std::string &&str) const {
141142 switch (getConversionKind ()) {
142143 case ConversionKind::Unboxed:
144+ case ConversionKind::Pointee:
143145 case ConversionKind::Ptr:
144146 return std::move (str);
145147 case ConversionKind::FullRefCount:
@@ -178,7 +180,7 @@ bool ConverterRefCount::VisitIncompleteArrayType(
178180}
179181
180182bool ConverterRefCount::VisitReferenceType (clang::ReferenceType *type) {
181- PushConversionKind push (*this , ConversionKind::Unboxed );
183+ PushConversionKind push (*this , ConversionKind::Pointee );
182184 StrCat (" Ptr<" );
183185 Convert (type->getPointeeType ());
184186 StrCat (token::kGt );
@@ -297,6 +299,7 @@ bool ConverterRefCount::VisitConstantArrayType(clang::ConstantArrayType *type) {
297299 case ConversionKind::Ptr:
298300 Convert (type->getElementType ());
299301 break ;
302+ case ConversionKind::Pointee:
300303 case ConversionKind::FullRefCount:
301304 StrCat (" Box<[" );
302305 Convert (type->getElementType ());
@@ -396,7 +399,9 @@ bool ConverterRefCount::VisitArraySubscriptExpr(
396399 clang::ArraySubscriptExpr *expr) {
397400 auto *base = expr->getBase ();
398401 if (base->IgnoreCasts ()->getType ()->isPointerType () ||
399- IsUnionArrayMember (base)) {
402+ IsUnionArrayMember (base) ||
403+ (IsReferenceType (base) &&
404+ base->IgnoreCasts ()->getType ()->isArrayType ())) {
400405 ConvertPointerSubscript (expr);
401406 } else {
402407 if (!base->IgnoreCasts ()->getType ()->isArrayType ()) {
@@ -846,7 +851,8 @@ bool ConverterRefCount::VisitDeclRefExpr(clang::DeclRefExpr *expr) {
846851 // std::vector<T>& gets converted to Ptr<vec<T>>
847852 // So we need to make a pointer to the vector itself
848853 if (isObject ()) {
849- if (IsBoxedType (ref->getPointeeType ())) {
854+ if (IsBoxedType (ref->getPointeeType ()) ||
855+ ref->getPointeeType ()->isArrayType ()) {
850856 StrCat (str, " .to_strong().as_pointer()" );
851857 computed_expr_type_ = ComputedExprType::FreshPointer;
852858 return false ;
@@ -1227,7 +1233,9 @@ bool ConverterRefCount::VisitImplicitCastExpr(clang::ImplicitCastExpr *expr) {
12271233 // smart enough to pick the right specialization
12281234 PushConversionKind push (*this , ConversionKind::Unboxed);
12291235 PushParen paren (*this );
1230- StrCat (ConvertPointer (sub_expr), keyword::kAs , ToString (expr->getType ()));
1236+ StrCat (IsReferenceType (sub_expr) ? ConvertObject (sub_expr)
1237+ : ConvertPointer (sub_expr),
1238+ keyword::kAs , ToString (expr->getType ()));
12311239 return false ;
12321240 }
12331241 }
@@ -1590,6 +1598,7 @@ bool ConverterRefCount::VisitInitListExpr(clang::InitListExpr *expr) {
15901598 case ConversionKind::Ptr:
15911599 Converter::VisitInitListExpr (expr);
15921600 break ;
1601+ case ConversionKind::Pointee:
15931602 case ConversionKind::FullRefCount:
15941603 StrCat (" Box::new(" );
15951604 Converter::VisitInitListExpr (expr);
@@ -2078,6 +2087,14 @@ std::string ConverterRefCount::ConvertVarInitValue(clang::QualType qual_type,
20782087 if (llvm::isa<clang::MaterializeTemporaryExpr>(expr->IgnoreImpCasts ())) {
20792088 return EmitMaterializedTempBinding (qual_type, expr);
20802089 }
2090+ if (qual_type.getNonReferenceType ()->isArrayType ()) {
2091+ if (IsStringLiteralExpr (expr)) {
2092+ return std::format (" Ptr::from_string_literal_array({})" ,
2093+ ToString (expr->IgnoreParens ()->IgnoreImplicit ()));
2094+ }
2095+ return std::format (" ({} as {})" , ConvertFreshPointer (expr),
2096+ ToString (qual_type));
2097+ }
20812098 return ConvertFreshPointer (expr);
20822099 }
20832100 return ConvertFreshRValue (expr, qual_type);
@@ -2449,7 +2466,7 @@ void ConverterRefCount::ConvertDeref(clang::Expr *expr) {
24492466 }
24502467
24512468 if (isObject ()) {
2452- if (IsBoxedType (pointee_type)) {
2469+ if (IsBoxedType (pointee_type) || pointee_type-> isArrayType () ) {
24532470 StrCat (" .to_strong().as_pointer()" );
24542471 computed_expr_type_ = ComputedExprType::FreshPointer;
24552472 }
0 commit comments