diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2019-02-26 19:10:00 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2019-02-26 19:10:00 +0000 |
commit | e5bf8dee56aaf4c489a1f3ceca04a8fcd1d2665a (patch) | |
tree | d91a3ddd87b0b57de059fb05f1b7671cf07e82b1 /gcc | |
parent | 140a0bddcc12f14fcbc914e117ccf79cc6dd16cc (diff) | |
download | gcc-e5bf8dee56aaf4c489a1f3ceca04a8fcd1d2665a.zip gcc-e5bf8dee56aaf4c489a1f3ceca04a8fcd1d2665a.tar.gz gcc-e5bf8dee56aaf4c489a1f3ceca04a8fcd1d2665a.tar.bz2 |
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 <tkoenig@gcc.gnu.org>
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 <tkoenig@gcc.gnu.org>
PR fortran/89496
* gfortran.dg/altreturn_9_0.f90: New file.
* gfortran.dg/altreturn_9_1.f90: New file.
From-SVN: r269226
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fortran/trans-types.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/altreturn_9_0.f90 | 10 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/altreturn_9_1.f90 | 7 |
5 files changed, 35 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 2293c9a..2646608 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2019-02-26 Thomas Koenig <tkoenig@gcc.gnu.org> + + 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 <jakub@redhat.com> 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 2115db2..58102ba 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 4317ad8..2f700d7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-02-26 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/89496 + * gfortran.dg/altreturn_9_0.f90: New file. + * gfortran.dg/altreturn_9_1.f90: New file. + 2019-02-26 Jakub Jelinek <jakub@redhat.com> 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 0000000..58715c7 --- /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 0000000..9549869 --- /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 |