Commit 1e003829 by Jason Merrill Committed by Jason Merrill

re PR c++/44333 (Ambiguity with typedef and using namespace)

	PR c++/44333
	* name-lookup.c (same_entity_p): New.
	(ambiguous_decl): Multiple declarations of the same entity
	are not ambiguous.

From-SVN: r160183
parent c440459b
2010-06-02 Jason Merrill <jason@redhat.com>
PR c++/9726
PR c++/23594
PR c++/44333
* name-lookup.c (same_entity_p): New.
(ambiguous_decl): Multiple declarations of the same entity
are not ambiguous.
2010-06-01 Jason Merrill <jason@redhat.com>
DR 990
......
......@@ -3698,6 +3698,31 @@ merge_functions (tree s1, tree s2)
return s1;
}
/* Returns TRUE iff OLD and NEW are the same entity.
3 [basic]/3: An entity is a value, object, reference, function,
enumerator, type, class member, template, template specialization,
namespace, parameter pack, or this.
7.3.4 [namespace.udir]/4: If name lookup finds a declaration for a name
in two different namespaces, and the declarations do not declare the
same entity and do not declare functions, the use of the name is
ill-formed. */
static bool
same_entity_p (tree one, tree two)
{
if (one == two)
return true;
if (!one || !two)
return false;
if (TREE_CODE (one) == TYPE_DECL
&& TREE_CODE (two) == TYPE_DECL
&& same_type_p (TREE_TYPE (one), TREE_TYPE (two)))
return true;
return false;
}
/* This should return an error not all definitions define functions.
It is not an error if we find two functions with exactly the
same signature, only if these are selected in overload resolution.
......@@ -3763,7 +3788,7 @@ ambiguous_decl (struct scope_binding *old, cxx_binding *new_binding, int flags)
if (!old->value)
old->value = val;
else if (val && val != old->value)
else if (val && !same_entity_p (val, old->value))
{
if (is_overloaded_fn (old->value) && is_overloaded_fn (val))
old->value = merge_functions (old->value, val);
......
2010-06-02 Jason Merrill <jason@redhat.com>
PR c++/9726
PR c++/23594
PR c++/44333
* g++.dg/tc1/dr101.C: Remove xfails.
2010-06-02 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/44372
......
......@@ -17,15 +17,14 @@ namespace Test1 {
namespace Test2 {
typedef unsigned int X; // { dg-bogus "X" "" { xfail *-*-* } }
typedef unsigned int X; // { dg-bogus "X" "" }
extern "C" int f2();
namespace N {
typedef unsigned int X; // { dg-bogus "X" "" { xfail *-*-* } }
typedef unsigned int X; // { dg-bogus "X" "" }
extern "C" int f2();
}
using namespace N;
int i = f2(); // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" }
X x; // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" { xfail *-*-* } }
X x; // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment