diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 1641eb6ca10..b6d21ad1bac 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -16327,7 +16327,7 @@ traverse_data_list (gfc_data_variable *var, locus *where) || end->expr_type != EXPR_CONSTANT) { gfc_error ("end of implied-do loop at %L could not be " - "simplified to a constant value", &start->where); + "simplified to a constant value", &end->where); retval = false; goto cleanup; } @@ -16335,7 +16335,14 @@ traverse_data_list (gfc_data_variable *var, locus *where) || step->expr_type != EXPR_CONSTANT) { gfc_error ("step of implied-do loop at %L could not be " - "simplified to a constant value", &start->where); + "simplified to a constant value", &step->where); + retval = false; + goto cleanup; + } + if (mpz_cmp_si (step->value.integer, 0) == 0) + { + gfc_error ("step of implied-do loop at %L shall not be zero", + &step->where); retval = false; goto cleanup; } diff --git a/gcc/testsuite/gfortran.dg/pr85796.f90 b/gcc/testsuite/gfortran.dg/pr85796.f90 new file mode 100644 index 00000000000..78683787fbb --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr85796.f90 @@ -0,0 +1,8 @@ +! { dg-do compile } +! PR fortran/85796 - Floating point exception with implied do in data statement + +program p + implicit none + integer :: i, j, x(2,2) + data ((x(i,j),i=1,2,j-1),j=1,2) /3*789/ ! { dg-error "step of implied-do loop" } +end