steakhal added a comment.

I notices some inconsistency between this `-fstrict-flex-arrays=N` flag and 
what the `RecordDecl::hasFlexibleArrayMember()` returns for an example like 
this:

  typedef unsigned long size_t;
  void *malloc(size_t);
  void free(void *);
  
  void field(void) {
    struct vec { size_t len; int data[0]; };
    struct vec *a = (struct vec*) malloc(sizeof(struct vec) + 10*sizeof(int));
    free(a);
  }

In the example, I use don't specify the `-fstrict-flex-arrays` flag, thus it 
should default to `0`, which means that any trailing arrays (let it be 
incomplete or of any concrete size), to be considered as a 
flexible-array-member.
In the AST, for the `RecordDecl`, I'd expect that the 
`hasFlexibleArrayMember()` member function would reflect this, and return 
`true`, however, it returns `false` instead.
It does so because in SemaDecl.cpp Sema::ActOnFields() 
<https://github.com/llvm/llvm-project/blob/0ce056a814f8dbfd8d9b7720ce1df489c6ba5ddb/clang/lib/Sema/SemaDecl.cpp#L18884-L18893>
 before doing some FAM-related checks and diagnostics it performs this check, 
guarding that branch:

  bool IsLastField = (i + 1 == Fields.end());
  if (FDTy->isFunctionType()) {
    // ...
  } else if (FDTy->isIncompleteArrayType() &&
             (Record || isa<ObjCContainerDecl>(EnclosingDecl))) {
    //This is the FAM handling branch.
    // ...
  }

Consequently, Sema will only set the bit for `hasFlexibleArrayMember` if the 
array is //incomplete//.
So my question is, if the `RecordDecl::hasFlexibleArrayMember()` should be 
consistent with the `-fstrict-flex-arrays` flag, or not?
@serge-sans-paille @aaron.ballman


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126864

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

Reply via email to