Hi,

this is my last and best try ;) Seriously, compared to the last posted version: 1- I added a rather large comment explaining what's going on wrt error recovery. 2- Took the occasion to clean-up a bit the code about bool vs int for flags (we had a mix). 3- Cleaned-up a bit the code itself (didn't notice that need_new is initialized as true)

Tested x86_64-linux, as usual.

Thanks,
Paolo.

////////////////////////


/cp
2012-06-01  Paolo Carlini  <paolo.carl...@oracle.com>

        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  <paolo.carl...@oracle.com>

        PR c++/26155
        * g++.dg/parse/namespace-alias-1.C: New.

Index: testsuite/g++.dg/parse/namespace-alias-1.C
===================================================================
--- testsuite/g++.dg/parse/namespace-alias-1.C  (revision 0)
+++ testsuite/g++.dg/parse/namespace-alias-1.C  (revision 0)
@@ -0,0 +1,7 @@
+// PR c++/26155
+
+namespace N
+{
+  namespace M = N;  // { dg-error "previous declaration" }
+  namespace M {}    // { dg-error "declaration of namespace" }
+}
Index: cp/name-lookup.c
===================================================================
--- cp/name-lookup.c    (revision 188104)
+++ cp/name-lookup.c    (working copy)
@@ -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;
        }
     }
 

Reply via email to