diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 4614324babb1c..f9dec60cf9907 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -6412,7 +6412,7 @@ def warn_superclass_variable_sized_type_not_at_end : Warning< " in superclass %3">, InGroup; 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< diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp index 4fcc2e7302c03..e4d7169752bc8 100644 --- a/clang/lib/AST/DeclBase.cpp +++ b/clang/lib/AST/DeclBase.cpp @@ -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; diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index cdb769a883550..fd778793346f5 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -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)) { diff --git a/clang/test/Sema/attr-counted-by.c b/clang/test/Sema/attr-counted-by.c index 654ddb7f1b42b..ab3b6e6d710b5 100644 --- a/clang/test/Sema/attr-counted-by.c +++ b/clang/test/Sema/attr-counted-by.c @@ -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 {