The patch for PR fortran/36192 that I committed here: https://gcc.gnu.org/ml/gcc-bugs/2015-10/msg02160.html
cured an ICE for a testcase that was reduced from the originally submitted mutilated Fortran code. The original code could in fact invoke another ICE. This patch cures that ICE. The patch simply checks that the array indices have INTEGER type before calling GMP routines. Tested om x86_64-*-freebsd. OK to commit? 2015-10-29 Steven G. Kargl <ka...@gcc.gnu.org> PR fortran/36192 * interface.c (get_expr_storage_size): Check for INTEGER type before calling gmp routines. 2015-10-29 Steven G. Kargl <ka...@gcc.gnu.org> PR fortran/36192 * gfortran.dg/pr36192_1.f90: New test. -- Steve
Index: gcc/fortran/interface.c =================================================================== --- gcc/fortran/interface.c (revision 229542) +++ gcc/fortran/interface.c (working copy) @@ -2455,7 +2455,9 @@ get_expr_storage_size (gfc_expr *e) { if (ref->u.ar.as->lower[i] && ref->u.ar.as->upper[i] && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT - && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT) + && ref->u.ar.as->lower[i]->ts.type == BT_INTEGER + && ref->u.ar.as->upper[i]->expr_type == EXPR_CONSTANT + && ref->u.ar.as->upper[i]->ts.type == BT_INTEGER) elements *= mpz_get_si (ref->u.ar.as->upper[i]->value.integer) - mpz_get_si (ref->u.ar.as->lower[i]->value.integer) + 1L; Index: gcc/testsuite/gfortran.dg/pr36192_1.f90 =================================================================== --- gcc/testsuite/gfortran.dg/pr36192_1.f90 (revision 0) +++ gcc/testsuite/gfortran.dg/pr36192_1.f90 (working copy) @@ -0,0 +1,12 @@ +! { dg-do compile } +! PR fortran/36192 +program three_body + real, parameter :: n = 2, d = 2 + real, dimension(n,d) :: x_hq ! { dg-error "of INTEGER type|of INTEGER type" } + call step(x_hq) + contains + subroutine step(x) + real, dimension(:,:), intent(in) :: x + end subroutine step +end program three_body +! { dg-prune-output "must have constant shape" }