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