aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/frontend-passes.c
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2019-09-15 14:57:48 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2019-09-15 14:57:48 +0000
commit3e0679c8d4e22f00614a52cbd2b33780f3f1a911 (patch)
tree8d885cf64ce2b13a250921c758286cace55da118 /gcc/fortran/frontend-passes.c
parentda903a1610ba94d9309ab3438bd8a6391a7e77fb (diff)
downloadgcc-3e0679c8d4e22f00614a52cbd2b33780f3f1a911.zip
gcc-3e0679c8d4e22f00614a52cbd2b33780f3f1a911.tar.gz
gcc-3e0679c8d4e22f00614a52cbd2b33780f3f1a911.tar.bz2
re PR fortran/91550 (ICE in do_subscript, at fortran/frontend-passes.c:2652)
2019-09-15 Thomas Koenig <tkoenig@gcc.gnu.org> 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> PR fortran/91550 * gfortran.dg/do_subscript_6.f90: New test. From-SVN: r275729
Diffstat (limited to 'gcc/fortran/frontend-passes.c')
-rw-r--r--gcc/fortran/frontend-passes.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c
index b095d5f..87518b8 100644
--- a/gcc/fortran/frontend-passes.c
+++ b/gcc/fortran/frontend-passes.c
@@ -2578,6 +2578,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)
@@ -2606,7 +2607,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 previously. */
+ if (sgn == 0)
+ continue;
+
+ mpz_init_set (do_step, dl->ext.iterator->step->value.integer);
+ }
+
else
continue;
@@ -2632,9 +2642,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;