[Clang] counted_by attr can apply only to C99 flexible array members (#72347)
Ensure that we're dealing only with C99 flexible array members. I.e.
ones with incomplete types:
struct s {
int count;
char array[]; /* note: no size specified */
};
Authored-by: Bill Wendling <isanbard@gmail.com>
This commit is contained in:
@@ -6412,7 +6412,7 @@ def warn_superclass_variable_sized_type_not_at_end : Warning<
|
||||
" in superclass %3">, InGroup<ObjCFlexibleArray>;
|
||||
|
||||
def err_counted_by_attr_not_on_flexible_array_member : Error<
|
||||
"'counted_by' only applies to flexible array members">;
|
||||
"'counted_by' only applies to C99 flexible array members">;
|
||||
def err_counted_by_attr_refers_to_flexible_array : Error<
|
||||
"'counted_by' cannot refer to the flexible array %0">;
|
||||
def err_counted_by_must_be_in_structure : Error<
|
||||
|
||||
@@ -421,9 +421,6 @@ bool Decl::isFlexibleArrayMemberLike(
|
||||
using FAMKind = LangOptions::StrictFlexArraysLevelKind;
|
||||
|
||||
llvm::APInt Size = CAT->getSize();
|
||||
FAMKind StrictFlexArraysLevel =
|
||||
Ctx.getLangOpts().getStrictFlexArraysLevel();
|
||||
|
||||
if (StrictFlexArraysLevel == FAMKind::IncompleteOnly)
|
||||
return false;
|
||||
|
||||
|
||||
@@ -8430,7 +8430,7 @@ bool Sema::CheckCountedByAttr(Scope *S, const FieldDecl *FD) {
|
||||
}
|
||||
|
||||
LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel =
|
||||
Context.getLangOpts().getStrictFlexArraysLevel();
|
||||
LangOptions::StrictFlexArraysLevelKind::IncompleteOnly;
|
||||
|
||||
if (!Decl::isFlexibleArrayMemberLike(Context, FD, FD->getType(),
|
||||
StrictFlexArraysLevel, true)) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// RUN: %clang_cc1 -fstrict-flex-arrays=3 -fsyntax-only -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
#define __counted_by(f) __attribute__((counted_by(f)))
|
||||
|
||||
@@ -38,7 +38,12 @@ struct array_of_ints_count {
|
||||
|
||||
struct not_a_fam {
|
||||
int count;
|
||||
struct bar *non_fam __counted_by(count); // expected-error {{'counted_by' only applies to flexible array members}}
|
||||
struct bar *non_fam __counted_by(count); // expected-error {{'counted_by' only applies to C99 flexible array members}}
|
||||
};
|
||||
|
||||
struct not_a_c99_fam {
|
||||
int count;
|
||||
struct bar *non_c99_fam[0] __counted_by(count); // expected-error {{'counted_by' only applies to C99 flexible array members}}
|
||||
};
|
||||
|
||||
struct annotated_with_anon_struct {
|
||||
|
||||
Reference in New Issue
Block a user