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