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:
parent
3f457a0db8
commit
6936461f13
5 changed files with 62 additions and 21 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
13
gcc/testsuite/g++.dg/lookup/name-clash5.C
Normal file
13
gcc/testsuite/g++.dg/lookup/name-clash5.C
Normal 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" }
|
13
gcc/testsuite/g++.dg/lookup/name-clash6.C
Normal file
13
gcc/testsuite/g++.dg/lookup/name-clash6.C
Normal 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" }
|
||||
}
|
Loading…
Add table
Reference in a new issue