[clang] [Clang] counted_by attr can apply only to C99 flexible array members (PR #72347)

Bill Wendling via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 14 21:38:59 PST 2023


https://github.com/bwendling created https://github.com/llvm/llvm-project/pull/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 */
  };

>From 21bea1699d80e53d857bf2656e75e56d98350dea Mon Sep 17 00:00:00 2001
From: Bill Wendling <isanbard at gmail.com>
Date: Tue, 14 Nov 2023 10:33:58 -0500
Subject: [PATCH] [Clang] counted_by attr can apply only to C99 flexible array
 members

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 */
  };
---
 clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +-
 clang/lib/AST/DeclBase.cpp                       | 3 ---
 clang/lib/Sema/SemaDeclAttr.cpp                  | 2 +-
 clang/test/Sema/attr-counted-by.c                | 9 +++++++--
 4 files changed, 9 insertions(+), 7 deletions(-)

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 {



More information about the cfe-commits mailing list