+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
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.
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);
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" }
}
-