From 5714705f1189d42e55c4209e2d2485c9d3bea1cd Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Fri, 1 Jun 2012 16:11:38 +0000 Subject: [PATCH] re PR c++/26155 (ICE after error with namespace alias) /cp 2012-06-01 Paolo Carlini PR c++/26155 * name-lookup.c (push_namespace): When error recovery is impossible just error out in duplicate_decls. /testsuite 2012-06-01 Paolo Carlini PR c++/26155 * g++.dg/parse/namespace-alias-1.C: New. From-SVN: r188113 --- gcc/cp/ChangeLog | 6 ++++ gcc/cp/name-lookup.c | 43 ++++++++++++++++++++------ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/g++.dg/parse/namespace-alias-1.C | 7 +++++ 4 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/namespace-alias-1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b1f0734..95e698d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-06-01 Paolo Carlini + + PR c++/26155 + * name-lookup.c (push_namespace): When error recovery is + impossible just error out in duplicate_decls. + 2012-05-31 Steven Bosscher * call.c: Do not include output.h. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 6930502..642f39f 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -3518,8 +3518,8 @@ void push_namespace (tree name) { tree d = NULL_TREE; - int need_new = 1; - int implicit_use = 0; + bool need_new = true; + bool implicit_use = false; bool anon = !name; bool subtime = timevar_cond_start (TV_NAME_LOOKUP); @@ -3535,8 +3535,8 @@ push_namespace (tree name) d = IDENTIFIER_NAMESPACE_VALUE (name); if (d) /* Reopening anonymous namespace. */ - need_new = 0; - implicit_use = 1; + need_new = false; + implicit_use = true; } else { @@ -3544,13 +3544,36 @@ push_namespace (tree name) d = IDENTIFIER_NAMESPACE_VALUE (name); if (d != NULL_TREE && TREE_CODE (d) == NAMESPACE_DECL) { - need_new = 0; - if (DECL_NAMESPACE_ALIAS (d)) - { - error ("namespace alias %qD not allowed here, assuming %qD", - d, DECL_NAMESPACE_ALIAS (d)); - d = DECL_NAMESPACE_ALIAS (d); + tree dna = DECL_NAMESPACE_ALIAS (d); + if (dna) + { + /* We do some error recovery for, eg, the redeclaration + of M here: + + namespace N {} + namespace M = N; + namespace M {} + + However, in nasty cases like: + + namespace N + { + namespace M = N; + namespace M {} + } + + we just error out below, in duplicate_decls. */ + if (NAMESPACE_LEVEL (dna)->level_chain + == current_binding_level) + { + error ("namespace alias %qD not allowed here, " + "assuming %qD", d, dna); + d = dna; + need_new = false; + } } + else + need_new = false; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 56bc070..28b853f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-06-01 Paolo Carlini + + PR c++/26155 + * g++.dg/parse/namespace-alias-1.C: New. + 2012-06-01 Christian Bruel * gcc.dg/spec-options.c: New test. diff --git a/gcc/testsuite/g++.dg/parse/namespace-alias-1.C b/gcc/testsuite/g++.dg/parse/namespace-alias-1.C new file mode 100644 index 0000000..627a95b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace-alias-1.C @@ -0,0 +1,7 @@ +// PR c++/26155 + +namespace N +{ + namespace M = N; // { dg-error "previous declaration" } + namespace M {} // { dg-error "declaration of namespace" } +} -- 2.7.4