diff options
author | Jakub Jelinek <jakub@redhat.com> | 2024-08-20 22:17:41 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2024-08-20 22:17:41 +0200 |
commit | d05949558ef1c8eeeb07399174a64f968f70e3ee (patch) | |
tree | 97a138af95260ac004e051322bf84e91451e57a8 /gcc | |
parent | 1db5ca04da365ac57f7d788a85055edcf13da708 (diff) | |
download | gcc-d05949558ef1c8eeeb07399174a64f968f70e3ee.zip gcc-d05949558ef1c8eeeb07399174a64f968f70e3ee.tar.gz gcc-d05949558ef1c8eeeb07399174a64f968f70e3ee.tar.bz2 |
c++: Appertain standard attributes after array closing square bracket to array type rather than declarator [PR110345]
For C++ 26 P2552R3 I went through all the spots (except modules) where
attribute-specifier-seq appears in the grammar and tried to construct
a testcase in all those spots, for now for [[deprecated]] attribute.
This is the second issue I found. The comment already correctly says that
attributes after closing ] appertain to the array type, but we were
appending them to returned_attrs, so effectively applying them to the
declarator (as if they appeared right after declarator-id).
2024-08-20 Jakub Jelinek <jakub@redhat.com>
PR c++/110345
* decl.cc (grokdeclarator): Apply declarator->std_attributes
for cdk_array to type, rather than chaining it to returned_attrs.
* g++.dg/cpp0x/gen-attrs-82.C: New test.
* g++.dg/gomp/attrs-3.C (foo): Expect different diagnostics for
omp::directive attribute after closing square bracket of an automatic
declaration and add a test with the attribute after array's
declarator-id.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/decl.cc | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/gen-attrs-82.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/attrs-3.C | 3 |
3 files changed, 8 insertions, 4 deletions
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index 12139e1..7ab73f1 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -13317,9 +13317,8 @@ grokdeclarator (const cp_declarator *declarator, /* [dcl.array]/1: The optional attribute-specifier-seq appertains to the - array. */ - returned_attrs = attr_chainon (returned_attrs, - declarator->std_attributes); + array type. */ + decl_attributes (&type, declarator->std_attributes, 0); break; case cdk_function: diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-82.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-82.C new file mode 100644 index 0000000..67c1a20 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-82.C @@ -0,0 +1,4 @@ +// { dg-do compile { target c++11 } } + +int a [[gnu::common]] [2]; +int b[2] [[gnu::common]]; // { dg-warning "'common' attribute does not apply to types" } diff --git a/gcc/testsuite/g++.dg/gomp/attrs-3.C b/gcc/testsuite/g++.dg/gomp/attrs-3.C index 7aab637..5658b3a 100644 --- a/gcc/testsuite/g++.dg/gomp/attrs-3.C +++ b/gcc/testsuite/g++.dg/gomp/attrs-3.C @@ -35,6 +35,7 @@ foo () int *[[omp::directive (threadprivate (t3))]] c; // { dg-warning "'omp::directive' scoped attribute directive ignored" } int &[[omp::directive (threadprivate (t4))]] d = b; // { dg-warning "'omp::directive' scoped attribute directive ignored" } typedef int T [[omp::directive (threadprivate (t5))]]; // { dg-error "'omp::directive' not allowed to be specified in this context" } - int e[10] [[omp::directive (threadprivate (t6))]]; // { dg-error "'omp::directive' not allowed to be specified in this context" } + int e [[omp::directive (threadprivate (t6))]] [10]; // { dg-error "'omp::directive' not allowed to be specified in this context" } + int f[10] [[omp::directive (threadprivate (t6))]]; // { dg-warning "'omp::directive' scoped attribute directive ignored" } struct [[omp::directive (threadprivate (t7))]] S {}; // { dg-error "'omp::directive' not allowed to be specified in this context" } } |