diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2008-01-08 15:14:33 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2008-01-08 15:14:33 +0000 |
commit | 0c6ce8b02716646c4ecf998a96c40621a5cba15e (patch) | |
tree | 428f9813996262ab2e07f6030752e8726adc9784 /gcc/fortran/expr.c | |
parent | 3672065a1dc197ed785e6b1ffae1449621c5e3d2 (diff) | |
download | gcc-0c6ce8b02716646c4ecf998a96c40621a5cba15e.zip gcc-0c6ce8b02716646c4ecf998a96c40621a5cba15e.tar.gz gcc-0c6ce8b02716646c4ecf998a96c40621a5cba15e.tar.bz2 |
re PR fortran/34476 (Parameters: Bogus out of bounds error in array constructor)
2008-01-08 Paul Thomas <pault@gcc.gnu.org>
PR fortran/34476
* expr.c (find_array_element): Check that the array bounds are
constant before using them. Use lower, as well as upper bound.
(check_restricted): Allow implied index variable.
2008-01-08 Paul Thomas <pault@gcc.gnu.org>
PR fortran/34476
* gfortran.dg/parameter_array_init_3.f90: New test.
From-SVN: r131396
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r-- | gcc/fortran/expr.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 8ae8464..e8b6548 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -1024,14 +1024,17 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar, cons = NULL; goto depart; } - - /* Check the bounds. */ - if (ar->as->upper[i] - && (mpz_cmp (e->value.integer, ar->as->upper[i]->value.integer) > 0 - || mpz_cmp (e->value.integer, - ar->as->lower[i]->value.integer) < 0)) + /* Check the bounds. */ + if ((ar->as->upper[i] + && ar->as->upper[i]->expr_type == EXPR_CONSTANT + && mpz_cmp (e->value.integer, + ar->as->upper[i]->value.integer) > 0) + || + (ar->as->lower[i]->expr_type == EXPR_CONSTANT + && mpz_cmp (e->value.integer, + 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]); cons = NULL; t = FAILURE; @@ -2496,6 +2499,7 @@ check_restricted (gfc_expr *e) if (sym->attr.in_common || sym->attr.use_assoc || sym->attr.dummy + || sym->attr.implied_index || sym->ns != gfc_current_ns || (sym->ns->proc_name != NULL && sym->ns->proc_name->attr.flavor == FL_MODULE) |