OSDN Git Service

PR c++/18100
authorlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Dec 2004 10:25:22 +0000 (10:25 +0000)
committerlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Dec 2004 10:25:22 +0000 (10:25 +0000)
* decl.c (lookup_and_check_tag): Diagnose nested class with
the same name as enclosing class.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@91866 138bc75d-0d04-0410-961f-82ee72b054a4

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

index c0da0a1..13cfc69 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 22fcc7c..410f686 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 0527609..468fb31 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" }