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

Reply via email to