diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 5bda4c2eea93a86f649c25bed6557e72d6d4a609..16efd1613019cd4c40734dfaba35f1f507052e86 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -5885,7 +5885,14 @@ lookup_qualified_name (tree scope, tree name, LOOK_want want, bool complain) name_lookup lookup (name, want); if (qualified_namespace_lookup (scope, &lookup)) - t = lookup.value; + { + t = lookup.value; + + /* If we have a known type overload, pull it out. This can happen + for using decls. */ + if (TREE_CODE (t) == OVERLOAD && TREE_TYPE (t) != unknown_type_node) + t = OVL_FUNCTION (t); + } } else if (cxx_dialect != cxx98 && TREE_CODE (scope) == ENUMERAL_TYPE) t = lookup_enumerator (scope, name); @@ -6515,8 +6522,9 @@ lookup_name_1 (tree name, LOOK_where where, LOOK_want want) found:; - /* If we have a single function from a using decl, pull it out. */ - if (val && TREE_CODE (val) == OVERLOAD && !really_overloaded_fn (val)) + /* If we have a known type overload, pull it out. This can happen + for both using decls and unhidden functions. */ + if (val && TREE_CODE (val) == OVERLOAD && TREE_TYPE (val) != unknown_type_node) val = OVL_FUNCTION (val); return val; diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 323d7424a8317446b9c73fb66952a4e940d6699d..bbf157eb47f49b977860a651202b6910e96859f6 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -28633,11 +28633,6 @@ cp_parser_lookup_name (cp_parser *parser, tree name, prefer_type_arg (tag_type), /*complain=*/true); - /* If we have a single function from a using decl, pull it out. */ - if (TREE_CODE (decl) == OVERLOAD - && !really_overloaded_fn (decl)) - decl = OVL_FUNCTION (decl); - if (pushed_scope) pop_scope (pushed_scope); }