nickdesaulniers added inline comments.

================
Comment at: clang/lib/AST/ExprConstant.cpp:11737
     bool Ret = HandleSizeof(Info, ExprLoc, Ty, Result);
     if (Ty->isStructureType() &&
         Ty->getAsStructureType()->getDecl()->hasFlexibleArrayMember()) {
----------------
efriedma wrote:
> For the second call to CheckHandleSizeof (line 11791), is the type of 
> consistent with the type of the variable?  If Ty refers to a field, I'm not 
> sure it makes sense to call getFlexibleArrayInitChars().  Something along the 
> lines of "struct Z { struct A { int x, y[]; } z; int a; };"
Can such an object even be initialized?
```
cat /tmp/x.c
struct Z { struct A { int x, y[]; } z; int a; };

static struct Z my_z = {
  .z = {
    .x = 42,
    .y = {
      0, 1, 2,
    },
  },
  .a = 42,
};

unsigned long foo (void) {
  return __builtin_object_size(&my_z, 1);
}
$ clang -O2 /tmp/x.c -S -o -
/tmp/x.c:1:37: warning: field 'z' with variable sized type 'struct A' not at 
the end of a struct or class is a GNU extension 
[-Wgnu-variable-sized-type-not-at-end]
struct Z { struct A { int x, y[]; } z; int a; };
                                    ^
/tmp/x.c:6:10: error: initialization of flexible array member is not allowed
    .y = {
         ^
/tmp/x.c:1:30: note: initialized flexible array member 'y' is here
struct Z { struct A { int x, y[]; } z; int a; };
                             ^
1 warning and 1 error generated.
```
or did you have something else in mind?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151148/new/

https://reviews.llvm.org/D151148

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to