mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-17 09:13:49 +08:00
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:
parent
b937dbf257
commit
c2b15fe27e
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
35
gcc/testsuite/gfortran.dg/pr101514.f90
Normal file
35
gcc/testsuite/gfortran.dg/pr101514.f90
Normal 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
|
Loading…
Reference in New Issue
Block a user