decl.c (duplicate_decls): Verify namespace names are unique.
authorOllie Wild <aaw@google.com>
Tue, 22 May 2007 20:36:49 +0000 (20:36 +0000)
committerOllie Wild <aaw@gcc.gnu.org>
Tue, 22 May 2007 20:36:49 +0000 (20:36 +0000)
* decl.c (duplicate_decls): Verify namespace names are unique.

* g++.dg/lookup/name-clash5.C: New test.
* g++.dg/lookup/name-clash6.C: New test.

From-SVN: r124960

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/name-clash5.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lookup/name-clash6.C [new file with mode: 0644]

index e6b4f45..7fc9a07 100644 (file)
@@ -1,3 +1,7 @@
+2007-05-22  Ollie Wild  <aaw@google.com>
+
+       * decl.c (duplicate_decls): Verify namespace names are unique.
+
 2007-05-21  Mark Mitchell  <mark@codesourcery.com>
 
        * decl.c (cxx_maybe_build_cleanup): Handle
index c76568a..02b3822 100644 (file)
@@ -1297,30 +1297,36 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
     }
   else if (TREE_CODE (olddecl) != TREE_CODE (newdecl))
     {
-      if ((TREE_CODE (olddecl) == TYPE_DECL && DECL_ARTIFICIAL (olddecl)
-          && TREE_CODE (newdecl) != TYPE_DECL
-          && ! (TREE_CODE (newdecl) == TEMPLATE_DECL
-                && TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL))
-         || (TREE_CODE (newdecl) == TYPE_DECL && DECL_ARTIFICIAL (newdecl)
-             && TREE_CODE (olddecl) != TYPE_DECL
-             && ! (TREE_CODE (olddecl) == TEMPLATE_DECL
-                   && (TREE_CODE (DECL_TEMPLATE_RESULT (olddecl))
-                       == TYPE_DECL))))
-       {
-         /* We do nothing special here, because C++ does such nasty
-            things with TYPE_DECLs.  Instead, just let the TYPE_DECL
-            get shadowed, and know that if we need to find a TYPE_DECL
-            for a given name, we can look in the IDENTIFIER_TYPE_VALUE
-            slot of the identifier.  */
-         return NULL_TREE;
+      /* C++ Standard, 3.3, clause 4:
+        "[Note: a namespace name or a class template name must be unique
+        in its declarative region (7.3.2, clause 14). ]"  */
+      if (TREE_CODE (olddecl) != NAMESPACE_DECL
+         && TREE_CODE (newdecl) != NAMESPACE_DECL
+         && (TREE_CODE (olddecl) != TEMPLATE_DECL
+             || TREE_CODE (DECL_TEMPLATE_RESULT (olddecl)) != TYPE_DECL)
+         && (TREE_CODE (newdecl) != TEMPLATE_DECL
+             || TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) != TYPE_DECL))
+       {
+         if ((TREE_CODE (olddecl) == TYPE_DECL && DECL_ARTIFICIAL (olddecl)
+              && TREE_CODE (newdecl) != TYPE_DECL)
+             || (TREE_CODE (newdecl) == TYPE_DECL && DECL_ARTIFICIAL (newdecl)
+                 && TREE_CODE (olddecl) != TYPE_DECL))
+           {
+             /* We do nothing special here, because C++ does such nasty
+                things with TYPE_DECLs.  Instead, just let the TYPE_DECL
+                get shadowed, and know that if we need to find a TYPE_DECL
+                for a given name, we can look in the IDENTIFIER_TYPE_VALUE
+                slot of the identifier.  */
+             return NULL_TREE;
+           }
+           
+           if ((TREE_CODE (newdecl) == FUNCTION_DECL
+                && DECL_FUNCTION_TEMPLATE_P (olddecl))
+               || (TREE_CODE (olddecl) == FUNCTION_DECL
+                   && DECL_FUNCTION_TEMPLATE_P (newdecl)))
+             return NULL_TREE;
        }
 
-      if ((TREE_CODE (newdecl) == FUNCTION_DECL
-          && DECL_FUNCTION_TEMPLATE_P (olddecl))
-         || (TREE_CODE (olddecl) == FUNCTION_DECL
-             && DECL_FUNCTION_TEMPLATE_P (newdecl)))
-       return NULL_TREE;
-
       error ("%q#D redeclared as different kind of symbol", newdecl);
       if (TREE_CODE (olddecl) == TREE_LIST)
        olddecl = TREE_VALUE (olddecl);
index 601700c..77b6a7f 100644 (file)
@@ -1,3 +1,8 @@
+2007-05-22  Ollie Wild  <aaw@google.com>
+
+       * g++.dg/lookup/name-clash5.C: New test.
+       * g++.dg/lookup/name-clash6.C: New test.
+
 2007-05-22  H.J. Lu  <hongjiu.lu@intel.com>
 
        * g++.dg/other/i386-2.C: Update comments on header files tested.
diff --git a/gcc/testsuite/g++.dg/lookup/name-clash5.C b/gcc/testsuite/g++.dg/lookup/name-clash5.C
new file mode 100644 (file)
index 0000000..7f220d8
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// C++ Standard, 3.3, clause 4:
+// "[Note: a namespace name or a class template name must be unique in its
+// declarative region (7.3.2, clause 14). ]"
+
+namespace N
+{ // { dg-error "previous declaration" }
+}
+
+class N; // { dg-error "redeclared" }
diff --git a/gcc/testsuite/g++.dg/lookup/name-clash6.C b/gcc/testsuite/g++.dg/lookup/name-clash6.C
new file mode 100644 (file)
index 0000000..63a0b15
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// C++ Standard, 3.3, clause 4:
+// "[Note: a namespace name or a class template name must be unique in its
+// declarative region (7.3.2, clause 14). ]"
+
+class N; // { dg-error "previous declaration" }
+
+namespace N
+{ // { dg-error "redeclared" }
+}