Skip to content

Commit ac09c8a

Browse files
committed
Handle array to pointer decay in union member
1 parent 4b1deff commit ac09c8a

1 file changed

Lines changed: 12 additions & 2 deletions

File tree

cpp2rust/converter/models/converter_refcount.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,6 +1499,7 @@ bool ConverterRefCount::VisitInitListExpr(clang::InitListExpr *expr) {
14991499
}
15001500

15011501
void ConverterRefCount::ConvertUnionMemberAccessor(clang::MemberExpr *expr) {
1502+
auto member = expr->getMemberDecl();
15021503
std::string str;
15031504
{
15041505
Buffer buf(*this);
@@ -1509,15 +1510,24 @@ void ConverterRefCount::ConvertUnionMemberAccessor(clang::MemberExpr *expr) {
15091510
str += "()";
15101511

15111512
if (isAddrOf()) {
1512-
StrCat(str);
1513+
if (member->getType()->isArrayType()) {
1514+
PushConversionKind push(*this, ConversionKind::Unboxed);
1515+
StrCat(std::format(
1516+
"{}.reinterpret_cast::<{}>()", str,
1517+
ToString(
1518+
member->getType()->getAsArrayTypeUnsafe()->getElementType())));
1519+
} else {
1520+
StrCat(str);
1521+
}
15131522
computed_expr_type_ = ComputedExprType::Pointer;
15141523
return;
15151524
}
1525+
15161526
if (isLValue()) {
15171527
pending_deref_.set(str);
15181528
return;
15191529
}
1520-
StrCat(DerefPtrExpr(str, expr->getMemberDecl()->getType()));
1530+
StrCat(DerefPtrExpr(str, member->getType()));
15211531
}
15221532

15231533
bool ConverterRefCount::VisitMemberExpr(clang::MemberExpr *expr) {

0 commit comments

Comments
 (0)