]> gcc.gnu.org Git - gcc.git/commit
c++: DR 569, DR 1693: fun with semicolons [PR113760]
authorMarek Polacek <polacek@redhat.com>
Tue, 13 Feb 2024 00:36:16 +0000 (19:36 -0500)
committerMarek Polacek <polacek@redhat.com>
Wed, 15 May 2024 17:23:08 +0000 (13:23 -0400)
commit0b3eac4b54a52bf206b88743d1e987badc97cff4
tree24554e7cde20e07745d3810ceae5ded21d9009ce
parent6ad7ca1bb905736c0f57688e93e9e77cbc71a325
c++: DR 569, DR 1693: fun with semicolons [PR113760]

Prompted by c++/113760, I started looking into a bogus "extra ;"
warning in C++11.  It quickly turned out that if I want to fix
this for good, the fix will not be so small.

This patch touches on DR 569, an extra ; at namespace scope should
be allowed since C++11:

  struct S {
  };
  ; // pedwarn in C++98

It also touches on DR 1693, which allows superfluous semicolons in
class definitions since C++11:

  struct S {
    int a;
    ; // pedwarn in C++98
  };

Note that a single semicolon is valid after a member function definition:

  struct S {
    void foo () {}; // only warns with -Wextra-semi
  };

There's a new function maybe_warn_extra_semi to handle all of the above
in a single place.  So now they all get a fix-it hint.

-Wextra-semi turns on all "extra ;" diagnostics.  Currently, options
like -Wc++11-compat or -Wc++11-extensions are not considered.

DR 1693
PR c++/113760
DR 569

gcc/c-family/ChangeLog:

* c.opt (Wextra-semi): Initialize to -1.

gcc/cp/ChangeLog:

* parser.cc (extra_semi_kind): New.
(maybe_warn_extra_semi): New.
(cp_parser_declaration): Call maybe_warn_extra_semi.
(cp_parser_member_declaration): Likewise.

gcc/ChangeLog:

* doc/invoke.texi: Update -Wextra-semi documentation.

gcc/testsuite/ChangeLog:

* g++.dg/diagnostic/semicolon1.C: New test.
* g++.dg/diagnostic/semicolon10.C: New test.
* g++.dg/diagnostic/semicolon11.C: New test.
* g++.dg/diagnostic/semicolon12.C: New test.
* g++.dg/diagnostic/semicolon13.C: New test.
* g++.dg/diagnostic/semicolon14.C: New test.
* g++.dg/diagnostic/semicolon15.C: New test.
* g++.dg/diagnostic/semicolon16.C: New test.
* g++.dg/diagnostic/semicolon17.C: New test.
* g++.dg/diagnostic/semicolon2.C: New test.
* g++.dg/diagnostic/semicolon3.C: New test.
* g++.dg/diagnostic/semicolon4.C: New test.
* g++.dg/diagnostic/semicolon5.C: New test.
* g++.dg/diagnostic/semicolon6.C: New test.
* g++.dg/diagnostic/semicolon7.C: New test.
* g++.dg/diagnostic/semicolon8.C: New test.
* g++.dg/diagnostic/semicolon9.C: New test.
20 files changed:
gcc/c-family/c.opt
gcc/cp/parser.cc
gcc/doc/invoke.texi
gcc/testsuite/g++.dg/diagnostic/semicolon1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon10.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon11.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon12.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon13.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon14.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon15.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon16.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon17.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon5.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon6.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon7.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon8.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/semicolon9.C [new file with mode: 0644]
This page took 0.067492 seconds and 6 git commands to generate.