From 0c6ce8b02716646c4ecf998a96c40621a5cba15e Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Tue, 8 Jan 2008 15:14:33 +0000 Subject: [PATCH] re PR fortran/34476 (Parameters: Bogus out of bounds error in array constructor) 2008-01-08 Paul Thomas 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 PR fortran/34476 * gfortran.dg/parameter_array_init_3.f90: New test. From-SVN: r131396 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/expr.c | 18 +++++++++++------- gcc/testsuite/ChangeLog | 5 +++++ .../gfortran.dg/parameter_array_init_3.f90 | 16 ++++++++++++++++ 4 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/parameter_array_init_3.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index dd2492dc97e..40c98afa2c3 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2008-01-08 Paul Thomas + + 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 PR fortran/34681 diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 8ae84649c80..e8b65483e76 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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5b95e2969f5..01389c9fa12 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-01-08 Paul Thomas + + PR fortran/34476 + * gfortran.dg/parameter_array_init_3.f90: New test. + 2008-01-08 Paul Thomas PR fortran/34681 diff --git a/gcc/testsuite/gfortran.dg/parameter_array_init_3.f90 b/gcc/testsuite/gfortran.dg/parameter_array_init_3.f90 new file mode 100644 index 00000000000..e39da8e8063 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/parameter_array_init_3.f90 @@ -0,0 +1,16 @@ +! { dg-do compile } +! Test the fix for PR34476 in which an 'out of bounds' error would be +! generated for the array initializations AND the implicit index 'i' +! would be rejected. +! +! Reported by Tobias Burnus following a thread +! on comp.lang.fortran (see PR) +! +module abuse_mod + implicit none + integer i + character(8), parameter :: HEX1 = '40490FDB' + integer(1), parameter :: MSKa1(len(HEX1)) = [(1,i=1,len(HEX1))] + integer(1), parameter :: ARR1(len(HEX1)) = [( MSKa1(i), i=1,len(HEX1) )] +end module abuse_mod +! { dg-final { cleanup-modules "abuse_mod" } } -- 2.30.2