diff mbox

PR fortran/36192 -- yet another fix for an ICE

Message ID 20151029183512.GA67095@troutmask.apl.washington.edu
State New
Headers show

Commit Message

Steve Kargl Oct. 29, 2015, 6:35 p.m. UTC
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  <kargl@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  <kargl@gcc.gnu.org>

	PR fortran/36192
	* gfortran.dg/pr36192_1.f90: New test.

Comments

Thomas Koenig Oct. 29, 2015, 7:43 p.m. UTC | #1
Am 29.10.2015 um 19:35 schrieb Steve Kargl:

> 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?

OK.

I would also have considered this one obvious.

Thanks for the patch!

	Thomas
diff mbox

Patch

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" }