https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77406

--- Comment #4 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Mon, Aug 29, 2016 at 09:35:59PM +0000, sgk at troutmask dot
apl.washington.edu wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77406
> 
> --- Comment #2 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
> Previous patch was bogus.  Try this one:
> 

The next previous patch can be replaced with

Index: gcc/fortran/interface.c
===================================================================
--- gcc/fortran/interface.c     (revision 239833)
+++ gcc/fortran/interface.c     (working copy)
@@ -1616,14 +1616,23 @@ gfc_compare_interfaces (gfc_symbol *s1, 
   f1 = gfc_sym_get_dummy_args (s1);
   f2 = gfc_sym_get_dummy_args (s2);

+  /* Special case: No arguments.  */
   if (f1 == NULL && f2 == NULL)
-    return 1;                  /* Special case: No arguments.  */
+    return 1;

   if (generic_flag)
     {
       if (count_types_test (f1, f2, p1, p2)
          || count_types_test (f2, f1, p2, p1))
        return 0;
+
+      /* Special case: alternate returns.  If both f1->sym and f2->sym are
+        NULL, then the leading formal arguments are alternate returns.  
+        The previous conditional should catch argument lists with 
+        different number of argument.  */
+      if (f1 && f1->sym == NULL && f2 && f2->sym == NULL)
+       return 1;
+
       if (generic_correspondence (f1, f2, p1, p2)
          || generic_correspondence (f2, f1, p2, p1))
        return 0;
@@ -1791,13 +1800,15 @@ check_interface1 (gfc_interface *p, gfc_
                                       generic_flag, 0, NULL, 0, NULL, NULL))
          {
            if (referenced)
-             gfc_error ("Ambiguous interfaces %qs and %qs in %s at %L",
-                        p->sym->name, q->sym->name, interface_name,
-                        &p->where);
+             gfc_error ("Ambiguous interfaces in %s for %qs at %L "
+                        "and %qs at %L", interface_name,
+                        q->sym->name, &q->sym->declared_at,
+                        p->sym->name, &p->sym->declared_at);
            else if (!p->sym->attr.use_assoc && q->sym->attr.use_assoc)
-             gfc_warning (0, "Ambiguous interfaces %qs and %qs in %s at %L",
-                          p->sym->name, q->sym->name, interface_name,
-                          &p->where);
+             gfc_warning (0, "Ambiguous interfaces in %s for %qs at %L "
+                          "and %qs at %L", interface_name,
+                          q->sym->name, &q->sym->declared_at,
+                          p->sym->name, &p->sym->declared_at);
            else
              gfc_warning (0, "Although not referenced, %qs has ambiguous "
                           "interfaces at %L", interface_name, &p->where);

Reply via email to