Skip to content

Commit b7feb0b

Browse files
committed
Handle array to pointer decay in union member
1 parent 48d6908 commit b7feb0b

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
@@ -1488,6 +1488,7 @@ bool ConverterRefCount::VisitInitListExpr(clang::InitListExpr *expr) {
14881488
}
14891489

14901490
void ConverterRefCount::ConvertUnionMemberAccessor(clang::MemberExpr *expr) {
1491+
auto member = expr->getMemberDecl();
14911492
std::string str;
14921493
{
14931494
Buffer buf(*this);
@@ -1498,15 +1499,24 @@ void ConverterRefCount::ConvertUnionMemberAccessor(clang::MemberExpr *expr) {
14981499
str += "()";
14991500

15001501
if (isAddrOf()) {
1501-
StrCat(str);
1502+
if (member->getType()->isArrayType()) {
1503+
PushConversionKind push(*this, ConversionKind::Unboxed);
1504+
StrCat(std::format(
1505+
"{}.reinterpret_cast::<{}>()", str,
1506+
ToString(
1507+
member->getType()->getAsArrayTypeUnsafe()->getElementType())));
1508+
} else {
1509+
StrCat(str);
1510+
}
15021511
computed_expr_type_ = ComputedExprType::Pointer;
15031512
return;
15041513
}
1514+
15051515
if (isLValue()) {
15061516
pending_deref_.set(str);
15071517
return;
15081518
}
1509-
StrCat(DerefPtrExpr(str, expr->getMemberDecl()->getType()));
1519+
StrCat(DerefPtrExpr(str, member->getType()));
15101520
}
15111521

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

0 commit comments

Comments
 (0)