Hi! 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. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2024-08-15 Jakub Jelinek <ja...@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. --- gcc/cp/parser.cc.jj 2024-08-15 18:00:33.202211372 +0200 +++ gcc/cp/parser.cc 2024-08-15 18:56:12.254139651 +0200 @@ -28268,7 +28268,11 @@ cp_parser_member_declaration (cp_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 { --- gcc/testsuite/g++.dg/cpp0x/gen-attrs-84.C.jj 2024-08-15 19:00:02.540314537 +0200 +++ gcc/testsuite/g++.dg/cpp0x/gen-attrs-84.C 2024-08-15 19:05:36.602231553 +0200 @@ -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" } +}; Jakub