diff options
author | Jakub Jelinek <jakub@redhat.com> | 2024-08-16 11:43:18 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2024-08-16 11:43:18 +0200 |
commit | 2f90f3850eaf9d703d9eb63d5f0347158aa11027 (patch) | |
tree | e83cc01718e451c4481a55a4d37d0dd551313837 | |
parent | 0470c8e007dfba46aed30ee82c9b0ee79c3d826d (diff) | |
download | gcc-2f90f3850eaf9d703d9eb63d5f0347158aa11027.zip gcc-2f90f3850eaf9d703d9eb63d5f0347158aa11027.tar.gz gcc-2f90f3850eaf9d703d9eb63d5f0347158aa11027.tar.bz2 |
c++: Pedwarn on [[]]; at class scope [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.
The fourth issue is that we just emit (when enabled) -Wextra-semi warning
not just for lone semicolon at class scope (correct), but also for
[[]]; or [[whatever]]; there too.
While just semicolon is valid in C++11 and newer,
https://eel.is/c++draft/class.mem#nt:member-declaration
allows empty-declaration, unlike namespace scope or block scope
something like attribute-declaration or empty statement with attributes
applied for it aren't supported.
While syntactically it matches
attribute-specifier-seq [opt] decl-specifier-seq [opt] member-declarator-list [opt] ;
with the latter two omitted, there is
https://eel.is/c++draft/class.mem#general-3
which says that is not valid.
So, the following patch emits a pedwarn in that case.
2024-08-16 Jakub Jelinek <jakub@redhat.com>
PR c++/110345
* parser.cc (cp_parser_member_declaration): Call maybe_warn_extra_semi
only if it is empty-declaration, if there are some tokens like
attribute, pedwarn that the declaration doesn't declare anything.
* g++.dg/cpp0x/gen-attrs-84.C: New test.
-rw-r--r-- | gcc/cp/parser.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/gen-attrs-84.C | 8 |
2 files changed, 13 insertions, 1 deletions
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 852efe4..c9654cf 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -28259,7 +28259,11 @@ cp_parser_member_declaration (cp_parser* parser) if (!decl_specifiers.any_specifiers_p) { cp_token *token = cp_lexer_peek_token (parser->lexer); - maybe_warn_extra_semi (token->location, extra_semi_kind::member); + if (decl_spec_token_start == token) + maybe_warn_extra_semi (token->location, extra_semi_kind::member); + else + pedwarn (decl_spec_token_start->location, OPT_Wpedantic, + "declaration does not declare anything"); } else { diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-84.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-84.C new file mode 100644 index 0000000..c573918c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-84.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } + +struct A { + [[]]; // { dg-error "declaration does not declare anything" } +}; +struct B { + [[gnu::deprecated]]; // { dg-error "declaration does not declare anything" } +}; |