------- Comment #2 from pault at gcc dot gnu dot org 2007-04-01 23:11 ------- This fixes it and regtests on x86_ia64/FC5. The arithmetic for finding the offset to a rank>1 element was plain wrong.
I will submit asap. Paul Index: gcc/fortran/expr.c =================================================================== *** gcc/fortran/expr.c (revision 123382) --- gcc/fortran/expr.c (working copy) *************** find_array_element (gfc_constructor *con *** 899,904 **** --- 899,906 ---- int i; mpz_t delta; mpz_t offset; + mpz_t span; + mpz_t tmp; gfc_expr *e; try t; *************** find_array_element (gfc_constructor *con *** 907,912 **** --- 909,916 ---- 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]); *************** find_array_element (gfc_constructor *con *** 930,936 **** --- 934,946 ---- } 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) *************** find_array_element (gfc_constructor *con *** 949,954 **** --- 959,966 ---- depart: mpz_clear (delta); mpz_clear (offset); + mpz_clear (span); + mpz_clear (tmp); if (e) gfc_free_expr (e); *rval = cons; -- pault at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- AssignedTo|unassigned at gcc dot gnu |pault at gcc dot gnu dot org |dot org | Status|NEW |ASSIGNED Last reconfirmed|2007-02-20 16:50:46 |2007-04-01 23:11:48 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30872