aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/trans-types.c5
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/altreturn_9_0.f9010
-rw-r--r--gcc/testsuite/gfortran.dg/altreturn_9_1.f907
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