re PR fortran/89496 (gcc/fortran/trans-types.c:3015:9: runtime error: member access...
authorThomas Koenig <tkoenig@gcc.gnu.org>
Tue, 26 Feb 2019 19:10:00 +0000 (19:10 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Tue, 26 Feb 2019 19:10:00 +0000 (19:10 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/trans-types.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/altreturn_9_0.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/altreturn_9_1.f90 [new file with mode: 0644]

index 2293c9ac47b1b4c3e2356e13b52495f35d7f078d..2646608faae45b9c9034b53d875ec699489432c0 100644 (file)
@@ -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.
index 2115db23f2cb9372bebaeaf7835838b72567f56f..58102bafed895ace49d729bb487901c39bc03626 100644 (file)
@@ -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);
     }
 }
index 4317ad895ef3a06c27f801ec3fb210d28c66c955..2f700d73bba5df2a07123971dcd8fe35c7447974 100644 (file)
@@ -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 (file)
index 0000000..58715c7
--- /dev/null
@@ -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 (file)
index 0000000..9549869
--- /dev/null
@@ -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