re PR c++/18100 (template member with same name as class not rejected)
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Wed, 8 Dec 2004 10:25:22 +0000 (10:25 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Wed, 8 Dec 2004 10:25:22 +0000 (10:25 +0000)
PR c++/18100
* decl.c (lookup_and_check_tag): Diagnose nested class with
the same name as enclosing class.

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

From-SVN: r91866

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

index c0da0a102c77ea4a07170c27e8330554457a0ad7..13cfc69426d7fe402abb72a4139cd0b1787cf912 100644 (file)
@@ -1,3 +1,9 @@
+2004-12-08  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/18100
+       * decl.c (lookup_and_check_tag): Diagnose nested class with 
+       the same name as enclosing class.
+
 2004-12-08  Nathan Sidwell  <nathan@codesourcery.com>
 
        PR c++/18803
index 22fcc7cda93aa5986e80bf61237df1542873fe64..410f686a3ae1d90cf6165310ccdcc34d9e353b46 100644 (file)
@@ -9169,6 +9169,18 @@ lookup_and_check_tag (enum tag_types tag_code, tree name,
 
   if (decl && TREE_CODE (decl) == TYPE_DECL)
     {
+      /* Look for invalid nested type:
+          class C {
+            class C {};
+          };  */
+      if (scope == ts_current && DECL_SELF_REFERENCE_P (decl))
+       {
+         error ("%qD has the same name as the class in which it is "
+                "declared",
+                decl);
+         return error_mark_node;
+       }
+
       /* Two cases we need to consider when deciding if a class
         template is allowed as an elaborated type specifier:
         1. It is a self reference to its own class.
index 05276095c7ef10200ee0b0041dce37e2967ced10..468fb31620c45a71036ce84c6009a5823e21a6cf 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-08  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/18100
+       * g++.dg/lookup/name-clash4.C: New test.
+
 2004-12-08  Nathan Sidwell  <nathan@codesourcery.com>
 
        PR c++/18672
diff --git a/gcc/testsuite/g++.dg/lookup/name-clash4.C b/gcc/testsuite/g++.dg/lookup/name-clash4.C
new file mode 100644 (file)
index 0000000..d4ff551
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+// PR c++/18100: Invalid nested type.
+
+struct A
+{
+    template<int> struct A {}; // { dg-error "same name" }
+};
+
+A::A<0> a;                     // { dg-error "not a template" }