Hi Dominique,
AFAICT there is no patch attached.
I guess that would have helped :-)
Here it is.
2019-02-25 Thomas Koenig <[email protected]>
PR fortran/89496
* trans-types.c (get_formal_from_actual_arglist): If
the actual arglist has no expression, the corresponding
formal arglist is an alternate return.
2019-02-25 Thomas Koenig <[email protected]>
PR fortran/89496
* gfortran.dg/altreturn_9_0.f90: New file.
* gfortran.dg/altreturn_9_1.f90: New file.
! { dg-do compile }
! { dg-options "-std=gnu" }
! See altreturn_9_0.f90
subroutine sub(i, *, j)
if (i == 10 .and. j == 20) return 1
return
end subroutine sub
! { dg-do run }
! { dg-options -std=gnu }
! { dg-additional-sources altreturn_9_1.f90 }
! PR 89496 - wrong type for alternate return was generated
program main
call sub(10, *10, 20)
stop 1
10 continue
end program main
Index: trans-types.c
===================================================================
--- trans-types.c (Revision 269161)
+++ trans-types.c (Arbeitskopie)
@@ -2988,9 +2988,9 @@ get_formal_from_actual_arglist (gfc_symbol *sym, g
f = &sym->formal;
for (a = actual_args; a != NULL; a = a->next)
{
+ (*f) = gfc_get_formal_arglist ();
if (a->expr)
{
- (*f) = gfc_get_formal_arglist ();
snprintf (name, GFC_MAX_SYMBOL_LEN, "_formal_%d", var_num ++);
gfc_get_symbol (name, NULL, &s);
if (a->expr->ts.type == BT_PROCEDURE)
@@ -3012,6 +3012,9 @@ get_formal_from_actual_arglist (gfc_symbol *sym, g
s->attr.intent = INTENT_UNKNOWN;
(*f)->sym = s;
}
+ else /* If a->expr is NULL, this is an alternate rerturn. */
+ (*f)->sym = NULL;
+
f = &((*f)->next);
}
}