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
This commit is contained in:
Tobias Schlüter 2005-03-01 01:41:41 +01:00 committed by Tobias Schlüter
parent ba751280b2
commit 2a4a783030
4 changed files with 87 additions and 16 deletions

View file

@ -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.

View file

@ -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)
{
if (ref->type == REF_COMPONENT)
as = ref->u.c.sym->as;
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;
}
}
if (ref->type != REF_ARRAY || ref->u.ar.type != AR_FULL)
gcc_unreachable ();
done:
if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
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]);
d = mpz_get_si (dim->value.integer);
if (d < 1 || d > as->rank
|| (d == as->rank && as->type == AS_ASSUMED_SIZE && upper))
{
gfc_error ("DIM argument at %L is out of bounds", &dim->where);
return &gfc_bad_expr;
}
e = upper ? as->upper[d-1] : as->lower[d-1];
if (e->expr_type != EXPR_CONSTANT)
return NULL;
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);
}

View file

@ -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.

View file

@ -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