Commit cdffe788 by Steven G. Kargl

re PR fortran/68053 (lower bound of implied shape array restricted too much)

2015-11-08  Steven g. Kargl  <kargl@gcc.gnu.org>

	PR fortran/68053
	* decl.c (add_init_expr_to_sym):  Try to reduce initialization expression
	before testing for a constant value.

2015-11-08  Steven g. Kargl  <kargl@gcc.gnu.org>

	PR fortran/68053
	* gfortran.dg/pr68053.f90: New test.

From-SVN: r229992
parent 61c94e79
2015-11-08 Steven g. Kargl <kargl@gcc.gnu.org>
PR fortran/68053
* decl.c (add_init_expr_to_sym): Try to reduce initialization expression
before testing for a constant value.
2015-11-08 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/68218
......
......@@ -1529,26 +1529,34 @@ add_init_expr_to_sym (const char *name, gfc_expr **initp, locus *var_locus)
for (dim = 0; dim < sym->as->rank; ++dim)
{
int k;
gfc_expr* lower;
gfc_expr* e;
gfc_expr *e, *lower;
lower = sym->as->lower[dim];
if (lower->expr_type != EXPR_CONSTANT)
/* If the lower bound is an array element from another
parameterized array, then it is marked with EXPR_VARIABLE and
is an initialization expression. Try to reduce it. */
if (lower->expr_type == EXPR_VARIABLE)
gfc_reduce_init_expr (lower);
if (lower->expr_type == EXPR_CONSTANT)
{
/* All dimensions must be without upper bound. */
gcc_assert (!sym->as->upper[dim]);
k = lower->ts.kind;
e = gfc_get_constant_expr (BT_INTEGER, k, &sym->declared_at);
mpz_add (e->value.integer, lower->value.integer,
init->shape[dim]);
mpz_sub_ui (e->value.integer, e->value.integer, 1);
sym->as->upper[dim] = e;
}
else
{
gfc_error ("Non-constant lower bound in implied-shape"
" declaration at %L", &lower->where);
return false;
}
/* All dimensions must be without upper bound. */
gcc_assert (!sym->as->upper[dim]);
k = lower->ts.kind;
e = gfc_get_constant_expr (BT_INTEGER, k, &sym->declared_at);
mpz_add (e->value.integer,
lower->value.integer, init->shape[dim]);
mpz_sub_ui (e->value.integer, e->value.integer, 1);
sym->as->upper[dim] = e;
}
sym->as->type = AS_EXPLICIT;
......
2015-11-08 Steven g. Kargl <kargl@gcc.gnu.org>
PR fortran/68053
* gfortran.dg/pr68053.f90: New test.
2015-11-06 Jan Hubicka <hubicka@ucw.cz>
* g++.dg/lto/pr68057_0.C: Fix testcase.
......
! { dg-do run }
! PR fortran/68053
! Original code contributed by Gerhard Steinmetz
! <gerhard dot steinmetx dot fortran at t-online dot de>
program p
integer, parameter :: n(3) = [1,2,3]
integer, parameter :: x(1) = 7
integer, parameter :: z(n(2):*) = x
if (lbound(z,1) /= 2) 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