name-lookup.c (qualified_lookup_using_namespace): Don't stop looking in used namespaces just because we found something on...

* name-lookup.c (qualified_lookup_using_namespace): Don't stop
	looking in used namespaces just because we found something on
	another branch.

From-SVN: r149637
This commit is contained in:
Jason Merrill 2009-07-14 14:15:49 -04:00 committed by Jason Merrill
parent 4e6a97250c
commit 3deeb3ff03
4 changed files with 32 additions and 6 deletions

View 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.

View 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. */

View 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.

View File

@ -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" }