Fortran: error recovery simplifying PACK with invalid arguments [PR106049]
gcc/fortran/ChangeLog: PR fortran/106049 * simplify.cc (is_constant_array_expr): A non-zero-sized constant array shall have a non-empty constructor. When the constructor is empty or missing, treat as non-constant. gcc/testsuite/ChangeLog: PR fortran/106049 * gfortran.dg/pack_simplify_1.f90: New test.
This commit is contained in:
parent
cab411a2b4
commit
6e9d5dfc29
2 changed files with 27 additions and 0 deletions
|
@ -233,6 +233,18 @@ is_constant_array_expr (gfc_expr *e)
|
|||
if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
|
||||
return false;
|
||||
|
||||
/* A non-zero-sized constant array shall have a non-empty constructor. */
|
||||
if (e->rank > 0 && e->shape != NULL && e->value.constructor == NULL)
|
||||
{
|
||||
mpz_init_set_ui (size, 1);
|
||||
for (int j = 0; j < e->rank; j++)
|
||||
mpz_mul (size, size, e->shape[j]);
|
||||
bool not_size0 = (mpz_cmp_si (size, 0) != 0);
|
||||
mpz_clear (size);
|
||||
if (not_size0)
|
||||
return false;
|
||||
}
|
||||
|
||||
for (c = gfc_constructor_first (e->value.constructor);
|
||||
c; c = gfc_constructor_next (c))
|
||||
if (c->expr->expr_type != EXPR_CONSTANT
|
||||
|
|
15
gcc/testsuite/gfortran.dg/pack_simplify_1.f90
Normal file
15
gcc/testsuite/gfortran.dg/pack_simplify_1.f90
Normal file
|
@ -0,0 +1,15 @@
|
|||
! { dg-do compile }
|
||||
! PR fortran/106049 - ICE in gfc_simplify_pack
|
||||
! Contributed by G.Steinmetz
|
||||
|
||||
program p
|
||||
type t
|
||||
end type
|
||||
logical, parameter :: m(0) = [ logical :: ]
|
||||
type(t), parameter :: a(0) = [ t :: ]
|
||||
type(t), parameter :: b(1) = [ t() ]
|
||||
type(t), parameter :: c(1) = [ t :: ] ! { dg-error "Different shape" }
|
||||
type(t), parameter :: d(0) = pack(a, m)
|
||||
type(t), parameter :: e(1) = pack(b, [.true.])
|
||||
type(t), parameter :: f(1) = pack(c, [.true.])
|
||||
end
|
Loading…
Add table
Reference in a new issue