2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-04-15 13:01:06 +08:00

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
This commit is contained in:
Kriang Lerdsuwanakij 2004-12-08 10:25:22 +00:00 committed by Kriang Lerdsuwanakij
parent 0710ccffc3
commit 4104f0f400
4 changed files with 35 additions and 0 deletions
gcc

@ -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

@ -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.

@ -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

@ -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" }