From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2071) id C33B63858D33; Mon, 23 Jan 2023 19:16:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C33B63858D33 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1674501373; bh=b5nSFC6j2t/11OQzSb0lRr57BnkV2xEaa74vJpI/+KU=; h=From:To:Subject:Date:From; b=tqmnBDPdV10+mvAD1rqBEoROu4OkmulDWskOhycpwvE5uSoifXzJTOMSIyIHET14s JJbjB+au4GV2CGLrk3Y5gAd0M4OS+8YbaA7ZWIWUfHk7U5fdxPI/3iMHxFd2GMsyj5 V4ZX2wL3VE5q1tdw23FrMgfRtiQ80gb1ST0WatLk= 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 r13-5311] Fortran: fix ICE in check_charlen_present [PR108420] X-Act-Checkin: gcc X-Git-Author: Harald Anlauf X-Git-Refname: refs/heads/master X-Git-Oldrev: 4b125d01a5d5e601961419396332b74eea2219bb X-Git-Newrev: e6669c0a50ed8aee9e5997d61e6271668d149218 Message-Id: <20230123191613.C33B63858D33@sourceware.org> Date: Mon, 23 Jan 2023 19:16:13 +0000 (GMT) List-Id: https://gcc.gnu.org/g:e6669c0a50ed8aee9e5997d61e6271668d149218 commit r13-5311-ge6669c0a50ed8aee9e5997d61e6271668d149218 Author: Harald Anlauf Date: Mon Jan 16 21:41:09 2023 +0100 Fortran: fix ICE in check_charlen_present [PR108420] gcc/fortran/ChangeLog: PR fortran/108420 * iresolve.cc (check_charlen_present): Preserve character length if there is no array constructor. gcc/testsuite/ChangeLog: PR fortran/108420 * gfortran.dg/pr108420.f90: New test. Diff: --- gcc/fortran/iresolve.cc | 9 ++++++--- gcc/testsuite/gfortran.dg/pr108420.f90 | 10 ++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/gcc/fortran/iresolve.cc b/gcc/fortran/iresolve.cc index 711e9178ad4..33794f0a858 100644 --- a/gcc/fortran/iresolve.cc +++ b/gcc/fortran/iresolve.cc @@ -94,9 +94,12 @@ check_charlen_present (gfc_expr *source) else if (source->expr_type == EXPR_ARRAY) { gfc_constructor *c = gfc_constructor_first (source->value.constructor); - source->ts.u.cl->length - = gfc_get_int_expr (gfc_charlen_int_kind, NULL, - c->expr->value.character.length); + if (c) + source->ts.u.cl->length + = gfc_get_int_expr (gfc_charlen_int_kind, NULL, + c->expr->value.character.length); + if (source->ts.u.cl->length == NULL) + gfc_internal_error ("check_charlen_present(): length not set"); } } diff --git a/gcc/testsuite/gfortran.dg/pr108420.f90 b/gcc/testsuite/gfortran.dg/pr108420.f90 new file mode 100644 index 00000000000..985c0b3bf53 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr108420.f90 @@ -0,0 +1,10 @@ +! { dg-do compile } +! PR fortran/108420 +! Contributed by G.Steinmetz + +program p + character :: c = 'c' + logical :: m = .true. + print *, merge(transfer('a', 'b', 0), c, .true.) + print *, merge(transfer('a', 'b', 0), c, m) +end