This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
C++ PATCH for c++/40746
- From: Jason Merrill <jason at redhat dot com>
- To: gcc-patches List <gcc-patches at gcc dot gnu dot org>
- Cc: Alexandre Oliva <aoliva at redhat dot com>
- Date: Tue, 14 Jul 2009 20:21:51 +0200
- Subject: C++ PATCH for c++/40746
While working on fixing the standard wording for inline namespaces, I
noticed what looked like an error in the logic for handling
using-directives in qualified lookup. Actually, it seems that Alexandre
noticed it too, as indicated by his ??? comment. So I whipped up a
testcase and fixed it.
Tested x86_64-pc-linux-gnu, applied to trunk.
2009-07-14 Jason Merrill <jason@redhat.com>
PR c++/40746
* name-lookup.c (qualified_lookup_using_namespace): Don't stop
looking in used namespaces just because we found something on
another branch.
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index c1032e3..7a8016f 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -3929,6 +3929,7 @@ qualified_lookup_using_namespace (tree name, tree scope,
/* ... and a list of namespace yet to see. */
tree todo = NULL_TREE;
tree todo_maybe = NULL_TREE;
+ tree *todo_weak = &todo_maybe;
tree usings;
timevar_push (TV_NAME_LOOKUP);
/* Look through namespace aliases. */
@@ -3942,9 +3943,7 @@ qualified_lookup_using_namespace (tree name, tree scope,
ambiguous_decl (result, binding, flags);
/* Consider strong using directives always, and non-strong ones
- if we haven't found a binding yet. ??? Shouldn't we consider
- non-strong ones if the initial RESULT is non-NULL, but the
- binding in the given namespace is? */
+ if we haven't found a binding yet. */
for (usings = DECL_NAMESPACE_USING (scope); usings;
usings = TREE_CHAIN (usings))
/* If this was a real directive, and we have not seen it. */
@@ -3959,12 +3958,12 @@ qualified_lookup_using_namespace (tree name, tree scope,
&& !purpose_member (TREE_PURPOSE (usings), seen)
&& !purpose_member (TREE_PURPOSE (usings), todo))
todo = tree_cons (TREE_PURPOSE (usings), NULL_TREE, todo);
- else if ((!result->value && !result->type)
+ else if (!binding
&& !purpose_member (TREE_PURPOSE (usings), seen)
&& !purpose_member (TREE_PURPOSE (usings), todo)
&& !purpose_member (TREE_PURPOSE (usings), todo_maybe))
- todo_maybe = tree_cons (TREE_PURPOSE (usings), NULL_TREE,
- todo_maybe);
+ *todo_weak = tree_cons (TREE_PURPOSE (usings), NULL_TREE,
+ *todo_weak);
}
if (todo)
{
@@ -3977,6 +3976,7 @@ qualified_lookup_using_namespace (tree name, tree scope,
scope = TREE_PURPOSE (todo_maybe);
todo = TREE_CHAIN (todo_maybe);
todo_maybe = NULL_TREE;
+ todo_weak = &todo;
}
else
scope = NULL_TREE; /* If there never was a todo list. */
diff --git a/gcc/testsuite/g++.dg/lookup/using20.C b/gcc/testsuite/g++.dg/lookup/using20.C
new file mode 100644
index 0000000..dc1d293
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using20.C
@@ -0,0 +1,18 @@
+// PR c++/40476
+
+namespace A
+{
+ int i; // { dg-error "i" }
+}
+using namespace A;
+namespace B
+{
+ namespace B2
+ {
+ int i; // { dg-error "i" }
+ }
+ using namespace B2;
+}
+using namespace B;
+
+int j = ::i; // { dg-error "ambiguous" }