From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2071) id 6CA95398A4B9; Fri, 30 Jul 2021 20:13:49 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6CA95398A4B9 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Harald Anlauf To: gcc-cvs@gcc.gnu.org Subject: [gcc r10-10015] Fortran: ICE, OOM while calculating sizes of derived type array components X-Act-Checkin: gcc X-Git-Author: Harald Anlauf X-Git-Refname: refs/heads/releases/gcc-10 X-Git-Oldrev: 95cda605a8f7e6b54c428b7d2c37b4f2ebe4a8d8 X-Git-Newrev: fa9729e7d2ee69fa0b18c925aeb3c2750874a05b Message-Id: <20210730201349.6CA95398A4B9@sourceware.org> Date: Fri, 30 Jul 2021 20:13:49 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Jul 2021 20:13:49 -0000 https://gcc.gnu.org/g:fa9729e7d2ee69fa0b18c925aeb3c2750874a05b commit r10-10015-gfa9729e7d2ee69fa0b18c925aeb3c2750874a05b Author: Harald Anlauf Date: Wed Jul 21 18:54:00 2021 +0200 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. (cherry picked from commit c2b15fe27e6a0e42b108111d51acce69628593b4) Diff: --- gcc/fortran/target-memory.c | 3 +++ gcc/fortran/trans-types.c | 4 ++-- gcc/testsuite/gfortran.dg/pr101514.f90 | 35 ++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/gcc/fortran/target-memory.c b/gcc/fortran/target-memory.c index 7f209913028..a3ef392b5d7 100644 --- a/gcc/fortran/target-memory.c +++ b/gcc/fortran/target-memory.c @@ -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; diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index 68d903d47ae..24758ddadee 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -1618,7 +1618,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); @@ -1668,7 +1668,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 diff --git a/gcc/testsuite/gfortran.dg/pr101514.f90 b/gcc/testsuite/gfortran.dg/pr101514.f90 new file mode 100644 index 00000000000..51fbf8a7e85 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr101514.f90 @@ -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