aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOllie Wild <aaw@google.com>2007-05-22 20:36:49 +0000
committerOllie Wild <aaw@gcc.gnu.org>2007-05-22 20:36:49 +0000
commit6936461f13040d03e5371a9069fe477ac8a7c705 (patch)
tree368888b60765a9526144f55f06ee0900145bfb40 /gcc
parent3f457a0db87291d494da0e701dab4ead009592be (diff)
downloadgcc-6936461f13040d03e5371a9069fe477ac8a7c705.zip
gcc-6936461f13040d03e5371a9069fe477ac8a7c705.tar.gz
gcc-6936461f13040d03e5371a9069fe477ac8a7c705.tar.bz2
decl.c (duplicate_decls): Verify namespace names are unique.
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/decl.c50
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lookup/name-clash5.C13
-rw-r--r--gcc/testsuite/g++.dg/lookup/name-clash6.C13
5 files changed, 63 insertions, 22 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e6b4f45..7fc9a07 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index c76568a..02b3822 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 601700c..77b6a7f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..7f220d8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/name-clash5.C
@@ -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
index 0000000..63a0b15
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/name-clash6.C
@@ -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" }
+}