shafik added a subscriber: rsmith. shafik added a comment. Thank you for this fix.
================ Comment at: clang/lib/Sema/SemaInit.cpp:808 unsigned NumElems = numStructUnionElements(ILE->getType()); - if (RDecl->hasFlexibleArrayMember()) + if (!RDecl->isUnion() && RDecl->hasFlexibleArrayMember()) ++NumElems; ---------------- Fznamznon wrote: > Just for some context, numStructUnionElements checks that there is a flexible > array member and returns number_of_initializable_fields-1 for structs. For > unions it just returns 1 or 0, so flexible array member caused adding one > more element to initlistexpr that was never properly handled. > > Instead of doing this change, we could probably never enter initialization > since the record (union) declaration is not valid, but that is not the case > even for other types of errors in code, for example, I've tried declaring > field of struct with a typo: > > ``` > struct { cha x[]; } r = {1}; > ``` > Initialization is still performed by clang. > Also, it seems MSVC considers flexible array member inside union as valid, so > the test code is probably not always invalid. I am not sure what to think here, looking at gcc documentation for this extension: https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html and using the following code: ``` struct f1 { int x; int y[]; } f1 = { 1, { 2, 3, 4 } }; // #1 struct f2 { struct f1 f1; int data[3]; } f2 = { { 1 }, { 2, 3, 4 } }; // #2 struct { char x[]; } r = {1}; // #3 ``` gcc rejects 2 and 3 even though 2 comes from their documentation. Clang warns on 2 and MSVC rejects 2 CC @aaron.ballman @rsmith Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D147626/new/ https://reviews.llvm.org/D147626 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits