* name-lookup.c (qualified_lookup_using_namespace): Don't stop
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Jul 2009 18:15:49 +0000 (18:15 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Jul 2009 18:15:49 +0000 (18:15 +0000)
looking in used namespaces just because we found something on
another branch.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@149637 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/using20.C [new file with mode: 0644]

index 67bbc74..d43341b 100644 (file)
@@ -1,5 +1,10 @@
 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.
+
        PR c++/40740
        * semantics.c (perform_koenig_lookup): Handle empty template args.
 
index c1032e3..7a8016f 100644 (file)
@@ -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.  */
index 58ce71c..1fa70ed 100644 (file)
@@ -1,5 +1,8 @@
 2009-07-14  Jason Merrill  <jason@redhat.com>
 
+       PR c++/40746
+       * g++.dg/lookup/using20.C: New.
+
        PR c++/40740
        * g++.dg/template/koenig8.C: New.
 
diff --git a/gcc/testsuite/g++.dg/lookup/using20.C b/gcc/testsuite/g++.dg/lookup/using20.C
new file mode 100644 (file)
index 0000000..dc1d293
--- /dev/null
@@ -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" }