From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2071) id 15F2E3858004; Sat, 28 Jan 2023 21:45:15 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 15F2E3858004 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1674942315; bh=YFJrwbki2vZSX0yDmP3Az6FDNwVK1yZ8RTGLaXnzltA=; h=From:To:Subject:Date:From; b=YkdTsJr9bLgzHv/iUtK5xEHyvAQnuVNsrG1K8UHOi9YsQLtF/1mso3uv8vzNw+KQH sRo5TJBi/+0nobreHwteDYwpuF2A+qnTQJKA2ohriNuyjnG7EOXCTW2PProzHyaluC ohsCVG/vPz53nO/wqLgC9Y7xUqMVnOnl7cS/hyE4= 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 r12-9077] Fortran: fix ICE in check_charlen_present [PR108420] X-Act-Checkin: gcc X-Git-Author: Harald Anlauf X-Git-Refname: refs/heads/releases/gcc-12 X-Git-Oldrev: daa4c49a4773f274b7a784cedd7b0e0b3c59523b X-Git-Newrev: 523ee9f5994961b27c61d46b27dbe064f68d0d76 Message-Id: <20230128214515.15F2E3858004@sourceware.org> Date: Sat, 28 Jan 2023 21:45:15 +0000 (GMT) List-Id: https://gcc.gnu.org/g:523ee9f5994961b27c61d46b27dbe064f68d0d76 commit r12-9077-g523ee9f5994961b27c61d46b27dbe064f68d0d76 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. (cherry picked from commit e6669c0a50ed8aee9e5997d61e6271668d149218) 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 dea19358b17..a21ebb14c76 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