From 4c6b3ec7507e827156a1fdf8b904303b50eedf75 Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Sat, 7 Apr 2007 20:23:40 +0000 Subject: re PR fortran/30872 (Bogus "size of variable is too large") 2007-04-07 Paul Thomas PR fortran/30872 * expr.c (find_array_element): Correct arithmetic for rank > 1. 2007-04-07 Paul Thomas PR fortran/30872 * gfortran.dg/parameter_array_element_1.f90: New test. From-SVN: r123644 --- gcc/fortran/expr.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'gcc/fortran/expr.c') diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index bf5b74d..d3f57172 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -899,6 +899,8 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar, int i; mpz_t delta; mpz_t offset; + mpz_t span; + mpz_t tmp; gfc_expr *e; try t; @@ -907,6 +909,8 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar, mpz_init_set_ui (offset, 0); mpz_init (delta); + mpz_init (tmp); + mpz_init_set_ui (span, 1); for (i = 0; i < ar->dimen; i++) { e = gfc_copy_expr (ar->start[i]); @@ -930,7 +934,13 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar, } mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer); + mpz_mul (delta, delta, span); mpz_add (offset, offset, delta); + + mpz_set_ui (tmp, 1); + mpz_add (tmp, tmp, ar->as->upper[i]->value.integer); + mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer); + mpz_mul (span, span, tmp); } if (cons) @@ -949,6 +959,8 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar, depart: mpz_clear (delta); mpz_clear (offset); + mpz_clear (span); + mpz_clear (tmp); if (e) gfc_free_expr (e); *rval = cons; -- cgit v1.1