From 4104f0f400f167b37370cbc20f4f7da218a95ded Mon Sep 17 00:00:00 2001 From: Kriang Lerdsuwanakij Date: Wed, 8 Dec 2004 10:25:22 +0000 Subject: [PATCH] re PR c++/18100 (template member with same name as class not rejected) 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 | 6 ++++++ gcc/cp/decl.c | 12 ++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/lookup/name-clash4.C | 12 ++++++++++++ 4 files changed, 35 insertions(+) create mode 100644 gcc/testsuite/g++.dg/lookup/name-clash4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c0da0a102c7..13cfc69426d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-12-08 Kriang Lerdsuwanakij + + PR c++/18100 + * decl.c (lookup_and_check_tag): Diagnose nested class with + the same name as enclosing class. + 2004-12-08 Nathan Sidwell PR c++/18803 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 22fcc7cda93..410f686a3ae 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 05276095c7e..468fb31620c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-12-08 Kriang Lerdsuwanakij + + PR c++/18100 + * g++.dg/lookup/name-clash4.C: New test. + 2004-12-08 Nathan Sidwell 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 index 00000000000..d4ff5513393 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/name-clash4.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Origin: Volker Reichelt + +// PR c++/18100: Invalid nested type. + +struct A +{ + template struct A {}; // { dg-error "same name" } +}; + +A::A<0> a; // { dg-error "not a template" } -- 2.30.2