]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR fortran/91550 (ICE in do_subscript, at fortran/frontend-passes.c...
authorThomas Koenig <tkoenig@gcc.gnu.org>
Wed, 18 Sep 2019 17:32:08 +0000 (17:32 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Wed, 18 Sep 2019 17:32:08 +0000 (17:32 +0000)
2019-09-18  Thomas Koenig  <tkoenig@gcc.gnu.org>

    Backport from trunk
    PR fortran/91550
    * frontend-passes.c (do_subscript): If step equals
    zero, a previuos error has been reported; do nothing
    in this case.
    * resolve.c (gfc_resolve_iterator): Move error checking
    after type conversion.

2019-09-18  Thomas Koenig  <tkoenig@gcc.gnu.org>

    Backport from trunk
    PR fortran/91550
    * gfortran.dg/do_subscript_6.f90: New test.

From-SVN: r275891

gcc/fortran/ChangeLog
gcc/fortran/frontend-passes.c
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/do_subscript_6.f90 [new file with mode: 0644]

index 44c139406252d58fa3559d0dc6a761a27732a867..74b86623a2c033f345aefdc24873f4efc54aec7c 100644 (file)
@@ -1,3 +1,13 @@
+2019-09-18  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       Backport from trunk
+       PR fortran/91550
+       * frontend-passes.c (do_subscript): If step equals
+       zero, a previuos error has been reported; do nothing
+       in this case.
+       * resolve.c (gfc_resolve_iterator): Move error checking
+       after type conversion.
+
 2019-09-15  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        Backport from trunk
index 08503ea5d1d65ee918dd675acfcd9e1f8042e4e7..e6786635788fe36756bd423230f21a4b553ed579 100644 (file)
@@ -2580,6 +2580,7 @@ do_subscript (gfc_expr **e)
              bool have_do_start, have_do_end;
              bool error_not_proven;
              int warn;
+             int sgn;
 
              dl = lp->c;
              if (dl == NULL)
@@ -2608,7 +2609,16 @@ do_subscript (gfc_expr **e)
                 Do not warn in this case.  */
 
              if (dl->ext.iterator->step->expr_type == EXPR_CONSTANT)
-               mpz_init_set (do_step, dl->ext.iterator->step->value.integer);
+               {
+                 sgn = mpz_cmp_ui (dl->ext.iterator->step->value.integer, 0);
+                 /* This can happen, but then the error has been
+                    reported previusly.  */
+                 if (sgn == 0)
+                   continue;
+
+                 mpz_init_set (do_step, dl->ext.iterator->step->value.integer);
+               }
+
              else
                continue;
 
@@ -2634,9 +2644,8 @@ do_subscript (gfc_expr **e)
              /* No warning inside a zero-trip loop.  */
              if (have_do_start && have_do_end)
                {
-                 int sgn, cmp;
+                 int cmp;
 
-                 sgn = mpz_cmp_ui (do_step, 0);
                  cmp = mpz_cmp (do_end, do_start);
                  if ((sgn > 0 && cmp < 0) || (sgn < 0 && cmp > 0))
                    break;
index 9647ef2c46a463a71496fe681f7f40a0c0ed629c..2d2d32e17339be2ac069e1d405be8a0a7d7c0af9 100644 (file)
@@ -7059,19 +7059,6 @@ gfc_resolve_iterator (gfc_iterator *iter, bool real_ok, bool own_scope)
                                  "Step expression in DO loop"))
     return false;
 
-  if (iter->step->expr_type == EXPR_CONSTANT)
-    {
-      if ((iter->step->ts.type == BT_INTEGER
-          && mpz_cmp_ui (iter->step->value.integer, 0) == 0)
-         || (iter->step->ts.type == BT_REAL
-             && mpfr_sgn (iter->step->value.real) == 0))
-       {
-         gfc_error ("Step expression in DO loop at %L cannot be zero",
-                    &iter->step->where);
-         return false;
-       }
-    }
-
   /* Convert start, end, and step to the same type as var.  */
   if (iter->start->ts.kind != iter->var->ts.kind
       || iter->start->ts.type != iter->var->ts.type)
@@ -7085,6 +7072,19 @@ gfc_resolve_iterator (gfc_iterator *iter, bool real_ok, bool own_scope)
       || iter->step->ts.type != iter->var->ts.type)
     gfc_convert_type (iter->step, &iter->var->ts, 1);
 
+  if (iter->step->expr_type == EXPR_CONSTANT)
+    {
+      if ((iter->step->ts.type == BT_INTEGER
+          && mpz_cmp_ui (iter->step->value.integer, 0) == 0)
+         || (iter->step->ts.type == BT_REAL
+             && mpfr_sgn (iter->step->value.real) == 0))
+       {
+         gfc_error ("Step expression in DO loop at %L cannot be zero",
+                    &iter->step->where);
+         return false;
+       }
+    }
+
   if (iter->start->expr_type == EXPR_CONSTANT
       && iter->end->expr_type == EXPR_CONSTANT
       && iter->step->expr_type == EXPR_CONSTANT)
index 6bb23d64b9829a32a268a3b58a8585bfb667406d..cd500d0b1c748a97cd08e1dfffba9114f8c5197e 100644 (file)
@@ -1,3 +1,9 @@
+2019-09-18  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       Backport from trunk
+       PR fortran/91550
+       * gfortran.dg/do_subscript_6.f90: New test.
+
 2019-09-15  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        Backport from trunk
diff --git a/gcc/testsuite/gfortran.dg/do_subscript_6.f90 b/gcc/testsuite/gfortran.dg/do_subscript_6.f90
new file mode 100644 (file)
index 0000000..d78b9d3
--- /dev/null
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! { dg-options "-std=legacy" }
+! PR 91550 - this used to cause an ICE
+! Test case by Gerhard Steinmetz
+program p
+   real :: a(3)
+   integer :: i
+   do i = 1, 3, .1 ! { dg-error "cannot be zero" }
+      a(i) = i
+   end do
+end