Author: Shafik Yaghmour Date: 2022-12-21T10:50:05-08:00 New Revision: 475cc44a2cba45c5449a323c6b331ddc593bd8de
URL: https://github.com/llvm/llvm-project/commit/475cc44a2cba45c5449a323c6b331ddc593bd8de DIFF: https://github.com/llvm/llvm-project/commit/475cc44a2cba45c5449a323c6b331ddc593bd8de.diff LOG: [Clang] Modify sanity check assert in AggExprEmitter::VisitInitListExpr to cover anonymous struct in a union GNU extension 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 Differential Revision: https://reviews.llvm.org/D139261 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/CodeGen/CGExprAgg.cpp clang/test/SemaCXX/anonymous-struct.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 09705a6b5b571..4ba28f5df5dc1 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -326,6 +326,9 @@ Bug Fixes - Fix bug where constant evaluation treated a pointer to member that points to a weak member as never being null. Such comparisons are now treated as non-constant. +- Fix sanity check when value initializing an empty union so that it takes into + account anonymous structs which is a GNU extension. This fixes + `Issue 58800 <https://github.com/llvm/llvm-project/issues/58800>`_ Improvements to Clang's diagnostics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp index 8ba21f8fc0046..303bcc89f671c 100644 --- a/clang/lib/CodeGen/CGExprAgg.cpp +++ b/clang/lib/CodeGen/CGExprAgg.cpp @@ -1724,7 +1724,7 @@ void AggExprEmitter::VisitCXXParenListOrInitListExpr( // 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; } diff --git a/clang/test/SemaCXX/anonymous-struct.cpp b/clang/test/SemaCXX/anonymous-struct.cpp index 7cf05ee3c49ae..e46bdc28d5059 100644 --- a/clang/test/SemaCXX/anonymous-struct.cpp +++ b/clang/test/SemaCXX/anonymous-struct.cpp @@ -189,3 +189,20 @@ typedef struct { // expected-warning {{anonymous non-C-compatible type}} } } 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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits