Compared to the first version, the major changes are:
1. Changed the error as a warning with -Wattributes per Jakub and Jason's
comments.
2. Update documentation accordingly.
3. Move the testing case to g++.dg/ext
Add one more new testing case for C++11
Adjust the testing case according to the new warning.
Bootstrapped and regression tested on both aarch64 and x86.
Okay for committing?
thanks.
Qing.
=================
The "counted_by" attribute currently is only supported in C, mention this
explicitly in documentation and also issue warnings when see "counted_by"
attribute in C++ with -Wattributes.
gcc/c-family/ChangeLog:
* c-attribs.cc (handle_counted_by_attribute): Is ignored and issues
warning with -Wattributes in C++ for now.
gcc/ChangeLog:
* doc/extend.texi: Explicitly mentions counted_by is available
only in C for now.
gcc/testsuite/ChangeLog:
* g++.dg/ext/flex-array-counted-by.C: New test.
* g++.dg/ext/flex-array-counted-by-2.C: New test.
---
gcc/c-family/c-attribs.cc | 10 +++++++++-
gcc/doc/extend.texi | 3 +++
gcc/testsuite/g++.dg/ext/flex-array-counted-by-2.C | 13 +++++++++++++
gcc/testsuite/g++.dg/ext/flex-array-counted-by.C | 11 +++++++++++
4 files changed, 36 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/g++.dg/ext/flex-array-counted-by-2.C
create mode 100644 gcc/testsuite/g++.dg/ext/flex-array-counted-by.C
diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc
index 685f212683f..4f064457dc4 100644
--- a/gcc/c-family/c-attribs.cc
+++ b/gcc/c-family/c-attribs.cc
@@ -2859,8 +2859,16 @@ handle_counted_by_attribute (tree *node, tree name,
tree argval = TREE_VALUE (args);
tree old_counted_by = lookup_attribute ("counted_by", DECL_ATTRIBUTES
(decl));
+ /* This attribute is not supported in C++. */
+ if (c_dialect_cxx ())
+ {
+ warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wattributes,
+ "%qE attribute is not supported for C++ for now, ignored",
+ name);
+ *no_add_attrs = true;
+ }
/* This attribute only applies to field decls of a structure. */
- if (TREE_CODE (decl) != FIELD_DECL)
+ else if (TREE_CODE (decl) != FIELD_DECL)
{
error_at (DECL_SOURCE_LOCATION (decl),
"%qE attribute is not allowed for a non-field"
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 48b27ff9f39..827044670e8 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -7848,6 +7848,9 @@ The @code{counted_by} attribute may be attached to the
C99 flexible array
member of a structure. It indicates that the number of the elements of the
array is given by the field "@var{count}" in the same structure as the
flexible array member.
+This attribute is available only in C for now.
+In C++, this attribute is ignored by default, and the compiler issues a
+warning with @option{-Wattributes}.
GCC may use this information to improve detection of object size information
for such structures and provide better results in compile-time diagnostics
and runtime features like the array bound sanitizer and
diff --git a/gcc/testsuite/g++.dg/ext/flex-array-counted-by-2.C
b/gcc/testsuite/g++.dg/ext/flex-array-counted-by-2.C
new file mode 100644
index 00000000000..6ac2b509b68
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/flex-array-counted-by-2.C
@@ -0,0 +1,13 @@
+/* Testing the fact that the attribute counted_by is not supported in C++. */
+/* { dg-do compile { target c++11 } } */
+/* { dg-options "-Wattributes" } */
+
+struct trailing {
+ int count;
+ int field [[gnu::counted_by (count)]] []; /* { dg-warning "attribute is not
supported for C\\+\\+ for now, ignored" } */
+};
+
+struct trailing1 {
+ int count1;
+ [[gnu::counted_by (count)]] int field []; /* { dg-warning "attribute is not
supported for C\\+\\+ for now, ignored" } */
+};
diff --git a/gcc/testsuite/g++.dg/ext/flex-array-counted-by.C
b/gcc/testsuite/g++.dg/ext/flex-array-counted-by.C
new file mode 100644
index 00000000000..8bc79d459df
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/flex-array-counted-by.C
@@ -0,0 +1,11 @@
+/* Testing the fact that the attribute counted_by is not supported in C++. */
+/* { dg-do compile } */
+/* { dg-options "-Wattributes" } */
+
+int size;
+int x __attribute ((counted_by (size))); /* { dg-warning "attribute is not
supported for C\\+\\+ for now, ignored" } */
+
+struct trailing {
+ int count;
+ int field[] __attribute ((counted_by (count))); /* { dg-warning "attribute
is not supported for C\\+\\+ for now, ignored" } */
+};
--
2.31.1