Fortran:Fix simplification of constructors with implied-do [PR98458]

2021-01-08  Paul Thomas  <pault@gcc.gnu.org>

gcc/fortran
	PR fortran/98458
	* simplify.c (is_constant_array_expr): If an array constructor
	expression has elements other than constants or structures, try
	fixing the expression with gfc_reduce_init_expr. Also, if shape
	is NULL, obtain the array size and set it.

gcc/testsuite/
	PR fortran/98458
	* gfortran.dg/implied_do_3.f90 : New test.
This commit is contained in:
Paul Thomas 2021-01-08 10:11:00 +00:00
parent 01d92cfd79
commit c231fca5de
2 changed files with 47 additions and 1 deletions

View File

@ -220,6 +220,8 @@ static bool
is_constant_array_expr (gfc_expr *e)
{
gfc_constructor *c;
bool array_OK = true;
mpz_t size;
if (e == NULL)
return true;
@ -231,13 +233,43 @@ is_constant_array_expr (gfc_expr *e)
if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
return false;
for (c = gfc_constructor_first (e->value.constructor);
c; c = gfc_constructor_next (c))
if (c->expr->expr_type != EXPR_CONSTANT
&& c->expr->expr_type != EXPR_STRUCTURE)
{
array_OK = false;
break;
}
/* Check and expand the constructor. */
if (!array_OK && gfc_init_expr_flag && e->rank == 1)
{
array_OK = gfc_reduce_init_expr (e);
/* gfc_reduce_init_expr resets the flag. */
gfc_init_expr_flag = true;
}
else
return array_OK;
/* Recheck to make sure that any EXPR_ARRAYs have gone. */
for (c = gfc_constructor_first (e->value.constructor);
c; c = gfc_constructor_next (c))
if (c->expr->expr_type != EXPR_CONSTANT
&& c->expr->expr_type != EXPR_STRUCTURE)
return false;
return true;
/* Make sure that the array has a valid shape. */
if (e->shape == NULL && e->rank == 1)
{
if (!gfc_array_size(e, &size))
return false;
e->shape = gfc_get_shape (1);
mpz_init_set (e->shape[0], size);
mpz_clear (size);
}
return array_OK;
}
/* Test for a size zero array. */

View File

@ -0,0 +1,14 @@
! { dg-do compile }
!
! Test the fix for PR98458 in which array expressions within the implied-do
! array constructor caused an ICE in trans-array.c(gfc_conv_array_initializer).
!
! Contributed by Xiao Liu <xiao.liu@compiler-dev.com>
!
program test
implicit none
integer :: i
integer, parameter :: t(6) = [1,2,3,4,5,6]
integer, parameter :: tmp(3,2) = reshape([(t(i:i+1),i=1,3)],[3,2])
print *, tmp ! Used to ICE
end