From a74d6927f9986c7df7d4d5c7f087380ba49fa9cf Mon Sep 17 00:00:00 2001 From: paolo Date: Wed, 11 Jun 2014 17:28:14 +0000 Subject: [PATCH] /cp 2014-06-11 Paolo Carlini PR c++/60265 * parser.c (cp_parser_using_declaration): Handle unscoped enums. * name-lookup.c (validate_nonmember_using_decl): Adjust error message. /testsuite 2014-06-11 Paolo Carlini PR c++/60265 * g++.dg/cpp0x/using-enum-1.C: New. * g++.dg/cpp0x/using-enum-2.C: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211479 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/name-lookup.c | 2 +- gcc/cp/parser.c | 2 ++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/cpp0x/using-enum-1.C | 20 ++++++++++++++++++++ gcc/testsuite/g++.dg/cpp0x/using-enum-2.C | 20 ++++++++++++++++++++ 6 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/using-enum-1.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/using-enum-2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e330f73ad04..8bd4a7389d2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,12 @@ 2014-06-11 Paolo Carlini + PR c++/60265 + * parser.c (cp_parser_using_declaration): Handle unscoped enums. + * name-lookup.c (validate_nonmember_using_decl): Adjust error + message. + +2014-06-11 Paolo Carlini + PR c++/19200 * parser.c (cp_parser_declarator): Add bool parameter. (cp_parser_direct_declarator): Likewise, use it. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 90f51083915..75b46ac9c7d 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -2487,7 +2487,7 @@ validate_nonmember_using_decl (tree decl, tree scope, tree name) member-declaration. */ if (TYPE_P (scope)) { - error ("%qT is not a namespace", scope); + error ("%qT is not a namespace or unscoped enum", scope); return NULL_TREE; } else if (scope == error_mark_node) diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 22d7ba69fe6..4dff139ff5d 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -16022,6 +16022,8 @@ cp_parser_using_declaration (cp_parser* parser, /*is_declaration=*/true); if (!qscope) qscope = global_namespace; + else if (UNSCOPED_ENUM_P (qscope)) + qscope = CP_TYPE_CONTEXT (qscope); if (access_declaration_p && cp_parser_error_occurred (parser)) /* Something has already gone wrong; there's no need to parse diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 12502181eb0..2a506f596c9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2014-06-11 Paolo Carlini + PR c++/60265 + * g++.dg/cpp0x/using-enum-1.C: New. + * g++.dg/cpp0x/using-enum-2.C: Likewise. + +2014-06-11 Paolo Carlini + PR c++/19200 * g++.dg/parse/friend9.C: New. * g++.dg/parse/friend10.C: Likewise. diff --git a/gcc/testsuite/g++.dg/cpp0x/using-enum-1.C b/gcc/testsuite/g++.dg/cpp0x/using-enum-1.C new file mode 100644 index 00000000000..9904d59aaaa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/using-enum-1.C @@ -0,0 +1,20 @@ +// PR c++/60265 +// { dg-do compile { target c++11 } } + +namespace A +{ + enum E { V }; + + using E::V; +} + +void foo() +{ + using A::E::V; +} + +using A::E::V; + +enum F { U }; + +using F::U; diff --git a/gcc/testsuite/g++.dg/cpp0x/using-enum-2.C b/gcc/testsuite/g++.dg/cpp0x/using-enum-2.C new file mode 100644 index 00000000000..0738c802b34 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/using-enum-2.C @@ -0,0 +1,20 @@ +// PR c++/60265 +// { dg-do compile { target c++11 } } + +namespace A +{ + enum class E { V }; + + using E::V; // { dg-error "not a namespace or unscoped enum" } +} + +void foo() +{ + using A::E::V; // { dg-error "not a namespace or unscoped enum" } +} + +using A::E::V; // { dg-error "not a namespace or unscoped enum" } + +enum class F { U }; + +using F::U; // { dg-error "not a namespace or unscoped enum" } -- 2.11.4.GIT