+2020-05-12 Marek Polacek <polacek@redhat.com>
+
+ PR c++/95074
+ * parser.c (cp_parser_postfix_expression) <case CPP_OPEN_PAREN>: When
+ looking for a block-scope function declaration, look through the whole
+ set, not just the first function in the overload set.
+
2020-05-12 Jakub Jelinek <jakub@redhat.com>
PR c++/95063
else if (!args->is_empty ()
&& is_overloaded_fn (postfix_expression))
{
- /* We only need to look at the first function,
- because all the fns share the attribute we're
- concerned with (all member fns or all local
- fns). */
- tree fn = get_first_fn (postfix_expression);
- fn = STRIP_TEMPLATE (fn);
-
/* Do not do argument dependent lookup if regular
lookup finds a member function or a block-scope
function declaration. [basic.lookup.argdep]/3 */
- if (!((TREE_CODE (fn) == USING_DECL && DECL_DEPENDENT_P (fn))
- || DECL_FUNCTION_MEMBER_P (fn)
- || DECL_LOCAL_FUNCTION_P (fn)))
+ bool do_adl_p = true;
+ tree fns = get_fns (postfix_expression);
+ for (lkp_iterator iter (fns); iter; ++iter)
+ {
+ tree fn = STRIP_TEMPLATE (*iter);
+ if ((TREE_CODE (fn) == USING_DECL
+ && DECL_DEPENDENT_P (fn))
+ || DECL_FUNCTION_MEMBER_P (fn)
+ || DECL_LOCAL_FUNCTION_P (fn))
+ {
+ do_adl_p = false;
+ break;
+ }
+ }
+
+ if (do_adl_p)
{
koenig_p = true;
if (!any_type_dependent_arguments_p (args))
--- /dev/null
+// PR c++/95074 - Function found via ADL when it should not.
+// { dg-do compile }
+
+namespace N {
+ struct S { };
+ void f(S);
+}
+
+namespace M {
+ void f(int);
+}
+
+void
+fn0 ()
+{
+ N::S s;
+ using M::f;
+ f (s);
+}
+
+void
+fn1 ()
+{
+ N::S s;
+ extern void f(char);
+ using M::f;
+ f (s); // { dg-error "no matching function" }
+}
+
+void
+fn2 ()
+{
+ N::S s;
+ using M::f;
+ extern void f(char);
+ f (s); // { dg-error "no matching function" }
+}
+
+void
+fn3 ()
+{
+ N::S s;
+ extern void (*f)(char);
+ f (s); // { dg-error "cannot convert" }
+}