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
This commit is contained in:
Ollie Wild 2007-05-22 20:36:49 +00:00 committed by Ollie Wild
parent 3f457a0db8
commit 6936461f13
5 changed files with 62 additions and 21 deletions

View file

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

View file

@ -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))))
/* 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))
{
/* 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 (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);

View file

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

View file

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

View file

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