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:
parent
ba751280b2
commit
2a4a783030
4 changed files with 87 additions and 16 deletions
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
20
gcc/testsuite/gfortran.dg/bound_1.f90
Normal file
20
gcc/testsuite/gfortran.dg/bound_1.f90
Normal 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
|
Loading…
Add table
Reference in a new issue