Fznamznon added inline comments.

================
Comment at: clang/lib/Sema/SemaInit.cpp:808
       unsigned NumElems = numStructUnionElements(ILE->getType());
-      if (RDecl->hasFlexibleArrayMember())
+      if (!RDecl->isUnion() && RDecl->hasFlexibleArrayMember())
         ++NumElems;
----------------
shafik wrote:
> 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 
Yes, I also had a feeling that we probably need to refine how these extensions 
are supported by clang, that is probably a bit out of scope of the fix though.


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

Reply via email to