Commit 2a4a7830 by Tobias Schlüter Committed by Tobias Schlüter

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
parent ba751280
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> 2005-02-28 Steven G. Kargl <kargl@gcc.gnu.org>
* trans-intrinsic.c (gfc_conv_intrinsic_iargc): remove boolean argument. * trans-intrinsic.c (gfc_conv_intrinsic_iargc): remove boolean argument.
......
...@@ -1766,16 +1766,18 @@ gfc_simplify_kind (gfc_expr * e) ...@@ -1766,16 +1766,18 @@ gfc_simplify_kind (gfc_expr * e)
static gfc_expr * 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_ref *ref;
gfc_array_spec *as; gfc_array_spec *as;
int i; gfc_expr *e;
int d;
if (array->expr_type != EXPR_VARIABLE) if (array->expr_type != EXPR_VARIABLE)
return NULL; return NULL;
if (dim == NULL) if (dim == NULL)
/* TODO: Simplify constant multi-dimensional bounds. */
return NULL; return NULL;
if (dim->expr_type != EXPR_CONSTANT) if (dim->expr_type != EXPR_CONSTANT)
...@@ -1783,29 +1785,66 @@ gfc_simplify_bound (gfc_expr * array, gfc_expr * dim, int upper) ...@@ -1783,29 +1785,66 @@ gfc_simplify_bound (gfc_expr * array, gfc_expr * dim, int upper)
/* Follow any component references. */ /* Follow any component references. */
as = array->symtree->n.sym->as; as = array->symtree->n.sym->as;
ref = array->ref; for (ref = array->ref; ref; ref = ref->next)
while (ref->next != NULL) {
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) gfc_error ("DIM argument at %L is out of bounds", &dim->where);
as = ref->u.c.sym->as; return &gfc_bad_expr;
ref = ref->next;
} }
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; return NULL;
i = mpz_get_si (dim->value.integer); return gfc_copy_expr (e);
if (upper)
return gfc_copy_expr (as->upper[i-1]);
else
return gfc_copy_expr (as->lower[i-1]);
} }
gfc_expr * gfc_expr *
gfc_simplify_lbound (gfc_expr * array, gfc_expr * dim) 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) ...@@ -3578,7 +3617,7 @@ gfc_simplify_trim (gfc_expr * e)
gfc_expr * gfc_expr *
gfc_simplify_ubound (gfc_expr * array, gfc_expr * dim) gfc_simplify_ubound (gfc_expr * array, gfc_expr * dim)
{ {
return gfc_simplify_bound (array, dim, 1); return simplify_bound (array, dim, 1);
} }
......
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> 2005-02-28 Janis Johnson <janis187@us.ibm.com>
* gcc.test-framework/dg-error-exp-P.c: Update message for new C parser. * gcc.test-framework/dg-error-exp-P.c: Update message for new C parser.
......
! { 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
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