Commit 138b3340 by Mikael Morin Committed by Mikael Morin

re PR fortran/37469 (invalid GMP usage on gfortran.dg/parameter_array_init_3.f90)

2008-12-09  Mikael Morin  <mikael.morin@tele2.fr>

	PR fortran/37469
	* expr.c (find_array_element): Simplify array bounds.
	Assert that both bounds are constant expressions.

From-SVN: r142606
parent fe7a047c
2008-12-09 Mikael Morin <mikael.morin@tele2.fr> 2008-12-09 Mikael Morin <mikael.morin@tele2.fr>
PR fortran/37469
* expr.c (find_array_element): Simplify array bounds.
Assert that both bounds are constant expressions.
2008-12-09 Mikael Morin <mikael.morin@tele2.fr>
PR fortran/35983 PR fortran/35983
* trans-expr.c (gfc_trans_subcomponent_assign): * trans-expr.c (gfc_trans_subcomponent_assign):
Add se's pre and post blocks to current block. Add se's pre and post blocks to current block.
......
...@@ -1028,6 +1028,14 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar, ...@@ -1028,6 +1028,14 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
mpz_init_set_ui (span, 1); mpz_init_set_ui (span, 1);
for (i = 0; i < ar->dimen; i++) for (i = 0; i < ar->dimen; i++)
{ {
if (gfc_reduce_init_expr (ar->as->lower[i]) == FAILURE
|| gfc_reduce_init_expr (ar->as->upper[i]) == FAILURE)
{
t = FAILURE;
cons = NULL;
goto depart;
}
e = gfc_copy_expr (ar->start[i]); e = gfc_copy_expr (ar->start[i]);
if (e->expr_type != EXPR_CONSTANT) if (e->expr_type != EXPR_CONSTANT)
{ {
...@@ -1035,14 +1043,15 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar, ...@@ -1035,14 +1043,15 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
goto depart; goto depart;
} }
gcc_assert (ar->as->upper[i]->expr_type == EXPR_CONSTANT
&& ar->as->lower[i]->expr_type == EXPR_CONSTANT);
/* Check the bounds. */ /* Check the bounds. */
if ((ar->as->upper[i] if ((ar->as->upper[i]
&& ar->as->upper[i]->expr_type == EXPR_CONSTANT
&& mpz_cmp (e->value.integer, && mpz_cmp (e->value.integer,
ar->as->upper[i]->value.integer) > 0) ar->as->upper[i]->value.integer) > 0)
|| (ar->as->lower[i]->expr_type == EXPR_CONSTANT || (mpz_cmp (e->value.integer,
&& mpz_cmp (e->value.integer, ar->as->lower[i]->value.integer) < 0))
ar->as->lower[i]->value.integer) < 0))
{ {
gfc_error ("Index in dimension %d is out of bounds " gfc_error ("Index in dimension %d is out of bounds "
"at %L", i + 1, &ar->c_where[i]); "at %L", i + 1, &ar->c_where[i]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment