diff options
author | Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de> | 2005-03-01 01:41:41 +0100 |
---|---|---|
committer | Tobias Schlüter <tobi@gcc.gnu.org> | 2005-03-01 01:41:41 +0100 |
commit | 2a4a78303029ec0f3765450a918e5677370d1106 (patch) | |
tree | 5e4997c1b9fc6c6c38a193b48e6f7f8d60f87a80 /gcc | |
parent | ba751280b20e9d870c185b2c7decfcc2a2d72c3b (diff) | |
download | gcc-2a4a78303029ec0f3765450a918e5677370d1106.zip gcc-2a4a78303029ec0f3765450a918e5677370d1106.tar.gz gcc-2a4a78303029ec0f3765450a918e5677370d1106.tar.bz2 |
re PR fortran/19479 (UBOUND causes ICE)
fortran/
PR fortran/19479
* simplify.c (gfc_simplify_bound): Rename to ...
(simplify_bound): ... this and overhaul.
testsuite/
PR fortran/19479
* gfortran.dg/bound_1.f90: New test.
From-SVN: r95713
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/simplify.c | 71 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/bound_1.f90 | 20 |
4 files changed, 87 insertions, 16 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0ddf41c..6df6301 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2005-02-28 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de> + (port from g95) + + PR fortran/19479 + * simplify.c (gfc_simplify_bound): Rename to ... + (simplify_bound): ... this and overhaul. + 2005-02-28 Steven G. Kargl <kargl@gcc.gnu.org> * trans-intrinsic.c (gfc_conv_intrinsic_iargc): remove boolean argument. diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 81bc015..c211714 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -1766,16 +1766,18 @@ gfc_simplify_kind (gfc_expr * e) static gfc_expr * -gfc_simplify_bound (gfc_expr * array, gfc_expr * dim, int upper) +simplify_bound (gfc_expr * array, gfc_expr * dim, int upper) { gfc_ref *ref; gfc_array_spec *as; - int i; + gfc_expr *e; + int d; if (array->expr_type != EXPR_VARIABLE) return NULL; if (dim == NULL) + /* TODO: Simplify constant multi-dimensional bounds. */ return NULL; if (dim->expr_type != EXPR_CONSTANT) @@ -1783,29 +1785,66 @@ gfc_simplify_bound (gfc_expr * array, gfc_expr * dim, int upper) /* Follow any component references. */ as = array->symtree->n.sym->as; - ref = array->ref; - while (ref->next != NULL) + for (ref = array->ref; ref; ref = ref->next) + { + switch (ref->type) + { + case REF_ARRAY: + switch (ref->u.ar.type) + { + case AR_ELEMENT: + as = NULL; + continue; + + case AR_FULL: + /* We're done because 'as' has already been set in the + previous iteration. */ + goto done; + + case AR_SECTION: + case AR_UNKNOWN: + return NULL; + } + + gcc_unreachable (); + + case REF_COMPONENT: + as = ref->u.c.component->as; + continue; + + case REF_SUBSTRING: + continue; + } + } + + gcc_unreachable (); + + done: + if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE) + return NULL; + + d = mpz_get_si (dim->value.integer); + + if (d < 1 || d > as->rank + || (d == as->rank && as->type == AS_ASSUMED_SIZE && upper)) { - if (ref->type == REF_COMPONENT) - as = ref->u.c.sym->as; - ref = ref->next; + gfc_error ("DIM argument at %L is out of bounds", &dim->where); + return &gfc_bad_expr; } - if (ref->type != REF_ARRAY || ref->u.ar.type != AR_FULL) + e = upper ? as->upper[d-1] : as->lower[d-1]; + + if (e->expr_type != EXPR_CONSTANT) return NULL; - - i = mpz_get_si (dim->value.integer); - if (upper) - return gfc_copy_expr (as->upper[i-1]); - else - return gfc_copy_expr (as->lower[i-1]); + + return gfc_copy_expr (e); } gfc_expr * gfc_simplify_lbound (gfc_expr * array, gfc_expr * dim) { - return gfc_simplify_bound (array, dim, 0); + return simplify_bound (array, dim, 0); } @@ -3578,7 +3617,7 @@ gfc_simplify_trim (gfc_expr * e) gfc_expr * gfc_simplify_ubound (gfc_expr * array, gfc_expr * dim) { - return gfc_simplify_bound (array, dim, 1); + return simplify_bound (array, dim, 1); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a58496b..26fa08c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-02-28 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de> + + PR fortran/19479 + * gfortran.dg/bound_1.f90: New test. + 2005-02-28 Janis Johnson <janis187@us.ibm.com> * gcc.test-framework/dg-error-exp-P.c: Update message for new C parser. diff --git a/gcc/testsuite/gfortran.dg/bound_1.f90 b/gcc/testsuite/gfortran.dg/bound_1.f90 new file mode 100644 index 0000000..ce872bb --- /dev/null +++ b/gcc/testsuite/gfortran.dg/bound_1.f90 @@ -0,0 +1,20 @@ +! { dg-do run } + implicit none + + type test_type + integer, dimension(5) :: a + end type test_type + + type (test_type), target :: tt(2) + integer i + + i = ubound(tt(1)%a, 1) + if (i/=5) call abort() + i = lbound(tt(1)%a, 1) + if (i/=1) call abort() + + i = ubound(tt, 1) + if (i/=2) call abort() + i = lbound(tt, 1) + if (i/=1) call abort() +end |