From: dodji Date: Tue, 8 Nov 2011 10:27:34 +0000 (+0000) Subject: Fix context handling of alias-declaration X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=7961105f7642980ba4a85841241949ed7173c61c;hp=4ac56fde83c3d304f1dabe96946e25f422e374f7 Fix context handling of alias-declaration gcc/cp/ * decl.c (start_decl): Update comment. * error.c (dump_alias_template_specialization): Dump the context of the specialization. * parser.c (cp_parser_alias_declaration): Call pop_scope on the pushed scope yielded by start_decl. gcc/testsuite * g++.dg/cpp0x/alias-decl-11.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181152 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5a492e9ca20..bcdecdf4cc3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2011-11-08 Dodji Seketeli + + Fix context handling of alias-declaration + * decl.c (start_decl): Update comment. + * error.c (dump_alias_template_specialization): Dump the context + of the specialization. + * parser.c (cp_parser_alias_declaration): Call pop_scope on the + pushed scope yielded by start_decl. + 2011-11-08 Paolo Carlini PR c++/50864 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index e4b91cc533b..1c337763110 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -4295,8 +4295,11 @@ groktypename (cp_decl_specifier_seq *type_specifiers, deleted function, but 0 (SD_UNINITIALIZED) if this is a variable implicitly initialized via a default constructor. ATTRIBUTES and PREFIX_ATTRIBUTES are GNU attributes associated with this declaration. - *PUSHED_SCOPE_P is set to the scope entered in this function, if any; if - set, the caller is responsible for calling pop_scope. */ + + The scope represented by the context of the returned DECL is pushed + (if it is not the global namespace) and is assigned to + *PUSHED_SCOPE_P. The caller is then responsible for calling + pop_scope on *PUSHED_SCOPE_P if it is set. */ tree start_decl (const cp_declarator *declarator, diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 841366f58fa..d2b6a62d964 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -341,6 +341,8 @@ dump_alias_template_specialization (tree t, int flags) gcc_assert (alias_template_specialization_p (t)); + if (!(flags & TFF_UNQUALIFIED_NAME)) + dump_scope (CP_DECL_CONTEXT (TYPE_NAME (t)), flags); name = TYPE_IDENTIFIER (t); pp_cxx_tree_identifier (cxx_pp, name); dump_template_parms (TYPE_TEMPLATE_INFO (t), diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 7d04971eea5..3d3587794f2 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -14891,7 +14891,7 @@ cp_parser_using_declaration (cp_parser* parser, static tree cp_parser_alias_declaration (cp_parser* parser) { - tree id, type, decl, dummy, attributes; + tree id, type, decl, pushed_scope = NULL_TREE, attributes; location_t id_location; cp_declarator *declarator; cp_decl_specifier_seq decl_specs; @@ -14925,12 +14925,15 @@ cp_parser_alias_declaration (cp_parser* parser) NULL_TREE, attributes); else decl = start_decl (declarator, &decl_specs, 0, - attributes, NULL_TREE, &dummy); + attributes, NULL_TREE, &pushed_scope); if (decl == error_mark_node) return decl; cp_finish_decl (decl, NULL_TREE, 0, NULL_TREE, 0); + if (pushed_scope) + pop_scope (pushed_scope); + /* If decl is a template, return its TEMPLATE_DECL so that it gets added into the symbol table; otherwise, return the TYPE_DECL. */ if (DECL_LANG_SPECIFIC (decl) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 12ad3d45dc7..a62b11cbebf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-08 Dodji Seketeli + + Fix context handling of alias-declaration + * g++.dg/cpp0x/alias-decl-11.C: New test. + 2011-11-08 Paolo Carlini PR c++/50864 diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-11.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-11.C new file mode 100644 index 00000000000..43ef7ba45e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-11.C @@ -0,0 +1,8 @@ +// { dg-options "-std=c++0x" } + +namespace N +{ + template using U = T*; +}; + +void f(N::U) { blah; } // { dg-error "void f(N::U)|not declared" }