Author: Bill Wendling Date: 2023-11-15T08:27:06-08:00 New Revision: 1a09cfb2f35ddcb5d4ebe63be8eca74ea6ff4a0b
URL: https://github.com/llvm/llvm-project/commit/1a09cfb2f35ddcb5d4ebe63be8eca74ea6ff4a0b DIFF: https://github.com/llvm/llvm-project/commit/1a09cfb2f35ddcb5d4ebe63be8eca74ea6ff4a0b.diff LOG: [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 <isanb...@gmail.com> Added: Modified: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/AST/DeclBase.cpp clang/lib/Sema/SemaDeclAttr.cpp clang/test/Sema/attr-counted-by.c Removed: ################################################################################ diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 4614324babb1c91..f9dec60cf990784 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<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< diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp index 4fcc2e7302c034c..e4d7169752bc857 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 cdb769a883550d0..fd778793346f502 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 654ddb7f1b42b1a..ab3b6e6d710b503 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 { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits