From 2884e22c4b89b5a12977743bede11cde3a781316 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 25 Aug 2006 17:03:50 +0000 Subject: [PATCH] re PR c++/28056 (enum accepted as scope) PR c++/28056 * decl.c (grokdeclarator): Disallow declarations with qualified names in local scopes. PR c++/28056 * g++.dg/parse/local1.C: New test. From-SVN: r116410 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 22 +++++++++++++++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/other/qual1.C | 2 +- gcc/testsuite/g++.dg/parse/local1.C | 18 ++++++++++++++++++ 5 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/local1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 629ba67d3f0..24fbf9aef27 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-08-25 Mark Mitchell + + PR c++/28056 + * decl.c (grokdeclarator): Disallow declarations with qualified + names in local scopes. + 2006-08-25 Nathan Sidwell PR c++/27787 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 8ba2a13578a..2d69cdbae04 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -6948,7 +6948,27 @@ grokdeclarator (const cp_declarator *declarator, break; if (qualifying_scope) { - if (TYPE_P (qualifying_scope)) + if (at_function_scope_p ()) + { + /* [dcl.meaning] + + A declarator-id shall not be qualified except + for ... + + None of the cases are permitted in block + scope. */ + if (qualifying_scope == global_namespace) + error ("invalid use of qualified-name %<::%D%>", + decl); + else if (TYPE_P (qualifying_scope)) + error ("invalid use of qualified-name %<%T::%D%>", + qualifying_scope, decl); + else + error ("invalid use of qualified-name %<%D::%D%>", + qualifying_scope, decl); + return error_mark_node; + } + else if (TYPE_P (qualifying_scope)) { ctype = qualifying_scope; if (innermost_code != cdk_function diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8e9e60a35ae..ee47bb34347 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-08-25 Mark Mitchell + + PR c++/28056 + * g++.dg/parse/local1.C: New test. + 2006-08-25 Nathan Sidwell PR c++/27787 diff --git a/gcc/testsuite/g++.dg/other/qual1.C b/gcc/testsuite/g++.dg/other/qual1.C index bd6f234931c..e4bae2315c2 100644 --- a/gcc/testsuite/g++.dg/other/qual1.C +++ b/gcc/testsuite/g++.dg/other/qual1.C @@ -6,6 +6,6 @@ struct A int i; void foo() { - int A::i = i; // { dg-error "extra qualification|not a static member" } + int A::i = i; // { dg-error "qualified" } } }; diff --git a/gcc/testsuite/g++.dg/parse/local1.C b/gcc/testsuite/g++.dg/parse/local1.C new file mode 100644 index 00000000000..cfcffc90864 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/local1.C @@ -0,0 +1,18 @@ +// PR c++/28056 + +void f1(); + +namespace N { + void f2(); +} + +class C { + static void f3(); +}; + +void foo() { + void ::f1(); // { dg-error "qualified" } + void N::f2(); // { dg-error "qualified" } + void C::f3(); // { dg-error "qualified" } + void ::f4(); // { dg-error "qualified" } +} -- 2.30.2