aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2010-06-02 15:19:05 -0400
committerJason Merrill <jason@gcc.gnu.org>2010-06-02 15:19:05 -0400
commit1e00382978e2fa9b1575ea15f5068cfbb5f877dc (patch)
treeb24cda1627e0891a6edcb0d288406810ab3fdbdb
parentc440459b92796c12b757a91dd8f53f8c027aaf8b (diff)
downloadgcc-1e00382978e2fa9b1575ea15f5068cfbb5f877dc.zip
gcc-1e00382978e2fa9b1575ea15f5068cfbb5f877dc.tar.gz
gcc-1e00382978e2fa9b1575ea15f5068cfbb5f877dc.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/name-lookup.c27
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/tc1/dr101.C7
4 files changed, 45 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f17c735d..8b883e7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+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
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 051d3c5..936c256 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 21ab458..dba6f87 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+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
diff --git a/gcc/testsuite/g++.dg/tc1/dr101.C b/gcc/testsuite/g++.dg/tc1/dr101.C
index c5b34a4..0316aaa 100644
--- a/gcc/testsuite/g++.dg/tc1/dr101.C
+++ b/gcc/testsuite/g++.dg/tc1/dr101.C
@@ -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" }
}
-