File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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+
153163bool IsUserDefinedDecl (const clang::Decl *decl) {
154164 const auto &ctx = decl->getASTContext ();
155165 const auto &src_mgr = ctx.getSourceManager ();
Original file line number Diff line number Diff line change @@ -44,6 +44,8 @@ bool IsCharPointerFieldFromLibc(const clang::ValueDecl *decl);
4444
4545bool IsCharArrayFieldFromLibc (const clang::ValueDecl *decl);
4646
47+ bool IsUnionArrayMember (const clang::Expr *base);
48+
4749bool IsUserDefinedDecl (const clang::Decl *decl);
4850
4951bool RefersToUserDefinedDecl (const clang::Expr *expr);
Original file line number Diff line number Diff line change @@ -377,7 +377,8 @@ std::string ConverterRefCount::ConvertPtrType(clang::QualType type) {
377377bool 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 ()) {
You can’t perform that action at this time.
0 commit comments