From: Jason Merrill Date: Tue, 14 Jul 2009 18:15:49 +0000 (-0400) Subject: name-lookup.c (qualified_lookup_using_namespace): Don't stop looking in used namespac... X-Git-Tag: releases/gcc-4.5.0~4588 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3deeb3ff03b0df2812a00d6713d4d026f0f2ea7e;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 67bbc740f6cc..d43341b8f6e9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2009-07-14 Jason Merrill + 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. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index c1032e3f80cc..7a8016ffa0bb 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/ChangeLog b/gcc/testsuite/ChangeLog index 58ce71cf8a09..1fa70edf74d9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2009-07-14 Jason Merrill + 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 index 000000000000..dc1d293a2ee4 --- /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" }