Commit 3deeb3ff by Jason Merrill Committed by Jason Merrill

name-lookup.c (qualified_lookup_using_namespace): Don't stop looking in used…

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
parent 4e6a9725
2009-07-14 Jason Merrill <jason@redhat.com> 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 PR c++/40740
* semantics.c (perform_koenig_lookup): Handle empty template args. * semantics.c (perform_koenig_lookup): Handle empty template args.
......
...@@ -3929,6 +3929,7 @@ qualified_lookup_using_namespace (tree name, tree scope, ...@@ -3929,6 +3929,7 @@ qualified_lookup_using_namespace (tree name, tree scope,
/* ... and a list of namespace yet to see. */ /* ... and a list of namespace yet to see. */
tree todo = NULL_TREE; tree todo = NULL_TREE;
tree todo_maybe = NULL_TREE; tree todo_maybe = NULL_TREE;
tree *todo_weak = &todo_maybe;
tree usings; tree usings;
timevar_push (TV_NAME_LOOKUP); timevar_push (TV_NAME_LOOKUP);
/* Look through namespace aliases. */ /* Look through namespace aliases. */
...@@ -3942,9 +3943,7 @@ qualified_lookup_using_namespace (tree name, tree scope, ...@@ -3942,9 +3943,7 @@ qualified_lookup_using_namespace (tree name, tree scope,
ambiguous_decl (result, binding, flags); ambiguous_decl (result, binding, flags);
/* Consider strong using directives always, and non-strong ones /* Consider strong using directives always, and non-strong ones
if we haven't found a binding yet. ??? Shouldn't we consider if we haven't found a binding yet. */
non-strong ones if the initial RESULT is non-NULL, but the
binding in the given namespace is? */
for (usings = DECL_NAMESPACE_USING (scope); usings; for (usings = DECL_NAMESPACE_USING (scope); usings;
usings = TREE_CHAIN (usings)) usings = TREE_CHAIN (usings))
/* If this was a real directive, and we have not seen it. */ /* If this was a real directive, and we have not seen it. */
...@@ -3959,12 +3958,12 @@ qualified_lookup_using_namespace (tree name, tree scope, ...@@ -3959,12 +3958,12 @@ qualified_lookup_using_namespace (tree name, tree scope,
&& !purpose_member (TREE_PURPOSE (usings), seen) && !purpose_member (TREE_PURPOSE (usings), seen)
&& !purpose_member (TREE_PURPOSE (usings), todo)) && !purpose_member (TREE_PURPOSE (usings), todo))
todo = tree_cons (TREE_PURPOSE (usings), NULL_TREE, 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), seen)
&& !purpose_member (TREE_PURPOSE (usings), todo) && !purpose_member (TREE_PURPOSE (usings), todo)
&& !purpose_member (TREE_PURPOSE (usings), todo_maybe)) && !purpose_member (TREE_PURPOSE (usings), todo_maybe))
todo_maybe = tree_cons (TREE_PURPOSE (usings), NULL_TREE, *todo_weak = tree_cons (TREE_PURPOSE (usings), NULL_TREE,
todo_maybe); *todo_weak);
} }
if (todo) if (todo)
{ {
...@@ -3977,6 +3976,7 @@ qualified_lookup_using_namespace (tree name, tree scope, ...@@ -3977,6 +3976,7 @@ qualified_lookup_using_namespace (tree name, tree scope,
scope = TREE_PURPOSE (todo_maybe); scope = TREE_PURPOSE (todo_maybe);
todo = TREE_CHAIN (todo_maybe); todo = TREE_CHAIN (todo_maybe);
todo_maybe = NULL_TREE; todo_maybe = NULL_TREE;
todo_weak = &todo;
} }
else else
scope = NULL_TREE; /* If there never was a todo list. */ scope = NULL_TREE; /* If there never was a todo list. */
......
2009-07-14 Jason Merrill <jason@redhat.com> 2009-07-14 Jason Merrill <jason@redhat.com>
PR c++/40746
* g++.dg/lookup/using20.C: New.
PR c++/40740 PR c++/40740
* g++.dg/template/koenig8.C: New. * g++.dg/template/koenig8.C: New.
......
// 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" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment