[clang] [Clang] counted_by attr can apply only to C99 flexible array members (PR #72347)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 14 21:39:31 PST 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Bill Wendling (bwendling)
<details>
<summary>Changes</summary>
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 */
};
---
Full diff: https://github.com/llvm/llvm-project/pull/72347.diff
4 Files Affected:
- (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+1-1)
- (modified) clang/lib/AST/DeclBase.cpp (-3)
- (modified) clang/lib/Sema/SemaDeclAttr.cpp (+1-1)
- (modified) clang/test/Sema/attr-counted-by.c (+7-2)
``````````diff
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 {
``````````
</details>
https://github.com/llvm/llvm-project/pull/72347
More information about the cfe-commits
mailing list