shafik created this revision. shafik added reviewers: aaron.ballman, erichkeane. Herald added a project: All. shafik requested review of this revision.
`AggExprEmitter::VisitInitListExpr` sanity checks that an empty union is really empty and not a semantic analysis failure. The assert is missing that we allow anonymous structs as a GNU extension. I have updated the assert to take that into account. This fixes: https://github.com/llvm/llvm-project/issues/58800 https://reviews.llvm.org/D139261 Files: clang/lib/CodeGen/CGExprAgg.cpp clang/test/SemaCXX/anonymous-struct.cpp Index: clang/test/SemaCXX/anonymous-struct.cpp =================================================================== --- clang/test/SemaCXX/anonymous-struct.cpp +++ clang/test/SemaCXX/anonymous-struct.cpp @@ -189,3 +189,20 @@ } } A; // expected-note {{given name 'A' for linkage purposes by this typedef}} } + +#if __cplusplus > 201103L +namespace GH58800 { +struct A { + union { + struct { + float red = 0.0f; + }; + }; +}; + +A GetA() { + A result{}; + return result; +} +} +#endif Index: clang/lib/CodeGen/CGExprAgg.cpp =================================================================== --- clang/lib/CodeGen/CGExprAgg.cpp +++ clang/lib/CodeGen/CGExprAgg.cpp @@ -1685,7 +1685,7 @@ // Make sure that it's really an empty and not a failure of // semantic analysis. for (const auto *Field : record->fields()) - assert(Field->isUnnamedBitfield() && "Only unnamed bitfields allowed"); + assert((Field->isUnnamedBitfield() || Field->isAnonymousStructOrUnion()) && "Only unnamed bitfields or ananymous class allowed"); #endif return; }
Index: clang/test/SemaCXX/anonymous-struct.cpp =================================================================== --- clang/test/SemaCXX/anonymous-struct.cpp +++ clang/test/SemaCXX/anonymous-struct.cpp @@ -189,3 +189,20 @@ } } A; // expected-note {{given name 'A' for linkage purposes by this typedef}} } + +#if __cplusplus > 201103L +namespace GH58800 { +struct A { + union { + struct { + float red = 0.0f; + }; + }; +}; + +A GetA() { + A result{}; + return result; +} +} +#endif Index: clang/lib/CodeGen/CGExprAgg.cpp =================================================================== --- clang/lib/CodeGen/CGExprAgg.cpp +++ clang/lib/CodeGen/CGExprAgg.cpp @@ -1685,7 +1685,7 @@ // Make sure that it's really an empty and not a failure of // semantic analysis. for (const auto *Field : record->fields()) - assert(Field->isUnnamedBitfield() && "Only unnamed bitfields allowed"); + assert((Field->isUnnamedBitfield() || Field->isAnonymousStructOrUnion()) && "Only unnamed bitfields or ananymous class allowed"); #endif return; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits