Fortran: ICE, OOM while calculating sizes of derived type array components

gcc/fortran/ChangeLog:

	PR fortran/101514
	* target-memory.c (gfc_interpret_derived): Size of array component
	of derived type can only be computed here for explicit shape.
	* trans-types.c (gfc_get_nodesc_array_type): Do not dereference
	NULL pointers.

gcc/testsuite/ChangeLog:

	PR fortran/101514
	* gfortran.dg/pr101514.f90: New test.
This commit is contained in:
Harald Anlauf 2021-07-21 18:54:00 +02:00
parent b937dbf257
commit c2b15fe27e
3 changed files with 40 additions and 2 deletions

View File

@ -534,6 +534,9 @@ gfc_interpret_derived (unsigned char *buffer, size_t buffer_size, gfc_expr *resu
{
int n;
if (cmp->as->type != AS_EXPLICIT)
return 0;
e->expr_type = EXPR_ARRAY;
e->rank = cmp->as->rank;

View File

@ -1644,7 +1644,7 @@ gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, gfc_packed packed,
GFC_TYPE_ARRAY_STRIDE (type, n) = tmp;
expr = as->lower[n];
if (expr->expr_type == EXPR_CONSTANT)
if (expr && expr->expr_type == EXPR_CONSTANT)
{
tmp = gfc_conv_mpz_to_tree (expr->value.integer,
gfc_index_integer_kind);
@ -1694,7 +1694,7 @@ gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, gfc_packed packed,
for (n = as->rank; n < as->rank + as->corank; n++)
{
expr = as->lower[n];
if (expr->expr_type == EXPR_CONSTANT)
if (expr && expr->expr_type == EXPR_CONSTANT)
tmp = gfc_conv_mpz_to_tree (expr->value.integer,
gfc_index_integer_kind);
else

View File

@ -0,0 +1,35 @@
! { dg-do compile }
! PR fortran/101514 - ICE: out of memory allocating ... bytes
subroutine s
type t1
integer :: a(..) ! { dg-error "must have an explicit shape" }
end type
type t2
integer :: a(*) ! { dg-error "must have an explicit shape" }
end type
type t3
integer :: a(:) ! { dg-error "must have an explicit shape" }
end type
type t4
integer :: a(0:) ! { dg-error "must have an explicit shape" }
end type
type t5
integer, allocatable :: a(:)
end type
type t6
integer, pointer :: a(:)
end type
type(t1) :: a1
type(t2) :: a2
type(t3) :: a3
type(t4) :: a4
type(t5) :: a5
type(t6) :: a6
a1 = transfer(1, a1)
a2 = transfer(1, a2)
a3 = transfer(1, a3)
a4 = transfer(1, a4)
a5 = transfer(1, a5)
a6 = transfer(1, a6)
end