From: Thomas Koenig Date: Tue, 26 Feb 2019 19:10:00 +0000 (+0000) Subject: re PR fortran/89496 (gcc/fortran/trans-types.c:3015:9: runtime error: member access... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e5bf8dee56aaf4c489a1f3ceca04a8fcd1d2665a;p=gcc.git re PR fortran/89496 (gcc/fortran/trans-types.c:3015:9: runtime error: member access within null pointer of type 'struct gfc_formal_arglist') 2019-02-26 Thomas Koenig 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-26 Thomas Koenig PR fortran/89496 * gfortran.dg/altreturn_9_0.f90: New file. * gfortran.dg/altreturn_9_1.f90: New file. From-SVN: r269226 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 2293c9ac47b..2646608faae 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2019-02-26 Thomas Koenig + + 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-26 Jakub Jelinek PR fortran/43210 @@ -8,7 +15,7 @@ PR fortran/89174 * trans-expr.c (gfc_find_and_cut_at_last_class_ref): Add is_mold - to garguments. If we are dealing with a MOLD, call + to arguments. If we are dealing with a MOLD, call gfc_expr_to_initialize(). * trans-stmt.c (gfc_trans_allocate): For MOLD, pass is_mold=true to gfc_find_and_cut_at_last_class_ref. diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index 2115db23f2c..58102bafed8 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -2988,9 +2988,9 @@ get_formal_from_actual_arglist (gfc_symbol *sym, gfc_actual_arglist *actual_args 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, gfc_actual_arglist *actual_args 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); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4317ad895ef..2f700d73bba 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-02-26 Thomas Koenig + + PR fortran/89496 + * gfortran.dg/altreturn_9_0.f90: New file. + * gfortran.dg/altreturn_9_1.f90: New file. + 2019-02-26 Jakub Jelinek PR c++/89481 diff --git a/gcc/testsuite/gfortran.dg/altreturn_9_0.f90 b/gcc/testsuite/gfortran.dg/altreturn_9_0.f90 new file mode 100644 index 00000000000..58715c7db40 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/altreturn_9_0.f90 @@ -0,0 +1,10 @@ +! { 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 diff --git a/gcc/testsuite/gfortran.dg/altreturn_9_1.f90 b/gcc/testsuite/gfortran.dg/altreturn_9_1.f90 new file mode 100644 index 00000000000..9549869a6be --- /dev/null +++ b/gcc/testsuite/gfortran.dg/altreturn_9_1.f90 @@ -0,0 +1,7 @@ +! { 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