From 851031b2fcd5210b96769c440db10130478d273c Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Wed, 27 Apr 2022 18:17:54 -0400 Subject: [PATCH] c++: global-namespace-qualified var after class def [PR90107] Here we wrongly reject the definition of "::N::a" struct A; namespace N { extern A a; } struct A {} ::N::a; because our code to diagnose a missing ; after a class definition doesn't realize that :: can follow a class definition. PR c++/90107 gcc/cp/ChangeLog: * parser.cc (cp_parser_class_specifier_1): Accept :: after a class definition. gcc/testsuite/ChangeLog: * g++.dg/parse/qualified6.C: New test. --- gcc/cp/parser.cc | 1 + gcc/testsuite/g++.dg/parse/qualified6.C | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 gcc/testsuite/g++.dg/parse/qualified6.C diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 169e6a62f5f..2235da10c7c 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -25933,6 +25933,7 @@ cp_parser_class_specifier_1 (cp_parser* parser) case CPP_OPEN_PAREN: case CPP_CLOSE_PAREN: case CPP_COMMA: + case CPP_SCOPE: want_semicolon = false; break; diff --git a/gcc/testsuite/g++.dg/parse/qualified6.C b/gcc/testsuite/g++.dg/parse/qualified6.C new file mode 100644 index 00000000000..68b51f771ec --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/qualified6.C @@ -0,0 +1,10 @@ +// PR c++/90107 +// { dg-do compile } + +struct A; +namespace N { extern A a; } +struct A {} ::N::a; + +struct A1; +struct B { static A1 a1; }; +struct A1 {} ::B::a1; -- 2.11.4.GIT