From: Paolo Carlini Date: Wed, 11 Jun 2014 17:28:14 +0000 (+0000) Subject: re PR c++/60265 ([C++11] using-declaration of enumerator fails if fully qualified) X-Git-Tag: releases/gcc-5.1.0~6936 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c7bb3484a24f6770e7633d38f3b1f7dcc46da6bb;p=thirdparty%2Fgcc.git re PR c++/60265 ([C++11] using-declaration of enumerator fails if fully qualified) /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. From-SVN: r211479 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e330f73ad048..8bd4a7389d23 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +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 diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 90f51083915b..75b46ac9c7dc 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 22d7ba69fe6d..4dff139ff5da 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 12502181eb04..2a506f596c9d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +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 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 000000000000..9904d59aaaa9 --- /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 000000000000..0738c802b344 --- /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" }