@@ -503,10 +503,13 @@ void ConverterRefCount::EmitRustUnion(clang::RecordDecl *decl) {
503503 {
504504 PushBrace impl_brace (*this );
505505 for (auto *field : decl->fields ()) {
506+ PushConversionKind push (*this , ConversionKind::FullRefCount);
507+ std::string storage_ty = ToString (field->getType ());
508+ Unwrap (storage_ty, " Value<" , " >" );
506509 StrCat (std::format (
507510 " pub fn {}(&self) -> Ptr<{}> {{ (self.__bytes.as_pointer() "
508511 " as Ptr<u8>).reinterpret_cast() }}" ,
509- GetNamedDeclAsString (field), Mapper::Map (field-> getType ()) ));
512+ GetNamedDeclAsString (field), storage_ty ));
510513 }
511514 }
512515
@@ -1310,9 +1313,9 @@ bool ConverterRefCount::VisitExplicitCastExpr(clang::ExplicitCastExpr *expr) {
13101313 } else if (expr->getSubExpr ()->getType ()->isPointerType () &&
13111314 !expr->getSubExpr ()->isNullPointerConstant (
13121315 ctx_, clang::Expr::NPC_ValueDependentIsNull)) {
1313- StrCat (std::format (" ( {}.to_strong().as_pointer() as {} )" ,
1316+ StrCat (std::format (" {}.reinterpret_cast::<{}>( )" ,
13141317 ToString (expr->getSubExpr ()),
1315- ToString (expr->getType ())));
1318+ ConvertPointeeType (expr->getType ())));
13161319 return false ;
13171320 }
13181321 return Converter::VisitExplicitCastExpr (expr);
@@ -1499,6 +1502,7 @@ bool ConverterRefCount::VisitInitListExpr(clang::InitListExpr *expr) {
14991502}
15001503
15011504void ConverterRefCount::ConvertUnionMemberAccessor (clang::MemberExpr *expr) {
1505+ auto member = expr->getMemberDecl ();
15021506 std::string str;
15031507 {
15041508 Buffer buf (*this );
@@ -1509,15 +1513,24 @@ void ConverterRefCount::ConvertUnionMemberAccessor(clang::MemberExpr *expr) {
15091513 str += " ()" ;
15101514
15111515 if (isAddrOf ()) {
1512- StrCat (str);
1516+ if (member->getType ()->isArrayType ()) {
1517+ PushConversionKind push (*this , ConversionKind::Unboxed);
1518+ StrCat (std::format (
1519+ " {}.reinterpret_cast::<{}>()" , str,
1520+ ToString (
1521+ member->getType ()->getAsArrayTypeUnsafe ()->getElementType ())));
1522+ } else {
1523+ StrCat (str);
1524+ }
15131525 computed_expr_type_ = ComputedExprType::Pointer;
15141526 return ;
15151527 }
1528+
15161529 if (isLValue ()) {
15171530 pending_deref_.set (str);
15181531 return ;
15191532 }
1520- StrCat (DerefPtrExpr (str, expr-> getMemberDecl () ->getType ()));
1533+ StrCat (DerefPtrExpr (str, member ->getType ()));
15211534}
15221535
15231536bool ConverterRefCount::VisitMemberExpr (clang::MemberExpr *expr) {
@@ -2071,7 +2084,7 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(
20712084 StrCat (
20722085 std::format (" {}.as_ref().unwrap()" , ConvertRValue (expr->getArg (0 ))));
20732086 if (isAddrOf ()) {
2074- StrCat (std::format (" .as_pointer().offset(({}) as isize )" ,
2087+ StrCat (std::format (" .as_pointer().offset(({}))" ,
20752088 ConvertRValue (expr->getArg (1 ))));
20762089 } else {
20772090 if (isRValue ()) {
@@ -2091,7 +2104,7 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(
20912104
20922105 if (isLValue ()) {
20932106 PushConversionKind push_ck (*this , ConversionKind::Unboxed);
2094- pending_deref_.set (std::format (" ({} as {}).offset({} as isize )" ,
2107+ pending_deref_.set (std::format (" ({} as {}).offset({})" ,
20952108 ConvertObject (expr->getArg (0 )),
20962109 ConvertPtrType (expr->getArg (0 )->getType ()),
20972110 ConvertRValue (expr->getArg (1 ))),
@@ -2111,7 +2124,7 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(
21112124 }
21122125
21132126 PushConversionKind push (*this , ConversionKind::Unboxed);
2114- StrCat (std::format (" ({} as {}).offset({} as isize )" ,
2127+ StrCat (std::format (" ({} as {}).offset({})" ,
21152128 ConvertObject (expr->getArg (0 )),
21162129 ConvertPtrType (expr->getArg (0 )->getType ()),
21172130 ConvertRValue (expr->getArg (1 ))));
@@ -2162,7 +2175,7 @@ void ConverterRefCount::ConvertArraySubscript(clang::Expr *base,
21622175
21632176 {
21642177 PushParen paren (*this , is_inner_boxed);
2165- StrCat (std::format (" ({} as {}).offset({} as isize )" ,
2178+ StrCat (std::format (" ({} as {}).offset({})" ,
21662179 ToString (base->IgnoreImplicit ()),
21672180 ConvertPtrType (base->IgnoreImplicit ()->getType ()),
21682181 ConvertRValue (idx)));
0 commit comments