Skip to content

Commit eb53257

Browse files
committed
Fix translation of union array members
1 parent 4b1deff commit eb53257

3 files changed

Lines changed: 14 additions & 1 deletion

File tree

cpp2rust/converter/converter_lib.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,16 @@ bool IsCharArrayFieldFromLibc(const clang::ValueDecl *decl) {
150150
field->getParent()->getLocation());
151151
}
152152

153+
bool IsUnionArrayMember(const clang::Expr *base) {
154+
if (auto *me =
155+
clang::dyn_cast<clang::MemberExpr>(base->IgnoreParenImpCasts())) {
156+
if (auto *fd = clang::dyn_cast<clang::FieldDecl>(me->getMemberDecl())) {
157+
return fd->getParent()->isUnion() && fd->getType()->isArrayType();
158+
}
159+
}
160+
return false;
161+
}
162+
153163
bool IsUserDefinedDecl(const clang::Decl *decl) {
154164
const auto &ctx = decl->getASTContext();
155165
const auto &src_mgr = ctx.getSourceManager();

cpp2rust/converter/converter_lib.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ bool IsCharPointerFieldFromLibc(const clang::ValueDecl *decl);
4444

4545
bool IsCharArrayFieldFromLibc(const clang::ValueDecl *decl);
4646

47+
bool IsUnionArrayMember(const clang::Expr *base);
48+
4749
bool IsUserDefinedDecl(const clang::Decl *decl);
4850

4951
bool RefersToUserDefinedDecl(const clang::Expr *expr);

cpp2rust/converter/models/converter_refcount.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,8 @@ std::string ConverterRefCount::ConvertPtrType(clang::QualType type) {
377377
bool ConverterRefCount::VisitArraySubscriptExpr(
378378
clang::ArraySubscriptExpr *expr) {
379379
auto *base = expr->getBase();
380-
if (base->IgnoreCasts()->getType()->isPointerType()) {
380+
if (base->IgnoreCasts()->getType()->isPointerType() ||
381+
(isLValue() && IsUnionArrayMember(base))) {
381382
ConvertPointerSubscript(expr);
382383
} else {
383384
if (!base->IgnoreCasts()->getType()->isArrayType()) {

0 commit comments

Comments
 (0)