From patchwork Sun Dec 20 22:15:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harald Anlauf X-Patchwork-Id: 1418845 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gcc.gnu.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=UuVB2GIr; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CzcP71GjBz9sVj for ; Mon, 21 Dec 2020 09:15:37 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6BA57386EC0E; Sun, 20 Dec 2020 22:15:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6BA57386EC0E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1608502531; bh=WV1YxeOJpL9RaQDmw9AJ312bwhbky6CF0YMgevxS1ls=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=UuVB2GIr/ucu+7SwIHx0Te//kPltLFSGFT/AFCdhHOhhIHCXQJJDloWkwAWVFMgJo HXAQ+/xOMnr8Un9zL6XdNDgILZEkDH/NOonGagGbsZz1TXMjqNUSk/ReS8KmwWFhXv t4vfOwsZ6vGJyu0GIf0k2eUHVSAGfkh5NIDLAgg8= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) by sourceware.org (Postfix) with ESMTPS id 169A23858034; Sun, 20 Dec 2020 22:15:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 169A23858034 X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [79.232.150.176] ([79.232.150.176]) by web-mail.gmx.net (3c-app-gmx-bap10.server.lan [172.19.172.80]) (via HTTP); Sun, 20 Dec 2020 23:15:25 +0100 MIME-Version: 1.0 Message-ID: To: fortran , gcc-patches Subject: [PATCH] PR fortran/93685 - [9/10/11 Regression] ICE in gfc_constructor_append_expr, at fortran/constructor.c:135 Date: Sun, 20 Dec 2020 23:15:25 +0100 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:tWKvIGnJhZNoCOz2Po59GWmyOrM2s9n1gaB4hCrpBSsTL93NDMYwgcG6tPaiTRAUP0axI GwWuS6p4Y3chbV6RLFAEKGjjyLrKuoNZZp9E0EQfgiDdCUPGe7k/miQcXWmlKYoBOGbcpZYMDP1z dUlf4dA7W/5h59qH5P/VRw/myrcc9TjzsPk8P8+r/AFkzNk5cxuZzbgVXlvAgrSg2gSYfhreQ3cx HYogUvxeCJEYHuTL7QKKCaY/gkIlv+Syg4OGJz8DkPi5nRpobFSdkTY8gaDO1CRLJU2+yMdglWaC y4= X-UI-Out-Filterresults: notjunk:1;V03:K0:me2QRctiyXw=:LMRRIyq9cNVhD4hQ5H2pru O9v2SWjzPQ/s3tZLmFvSh3zoikiCx7pIlYrQmbZdeW+WA19uJMb39JUuSs6keZFthtnMxeAHv vOnB4jZnV5AGvDp4oKZyShckEJiNLpeDlrmAwb7GAzu2oiVAouTUrQfzYvdNQvIdZZ54FZ3LS QTB+eFJeUFE5c5JqErK4pr7V1TTPQFuHgrlDiYhDiX5kGXX4I3adpa2Y76md40Op0KMq8ZaFJ J58voJpRzLivAG9My0h491I5pgxceFWJlYIcaCsZMaFnR1SQrcm21IfK339u+yZFn5idJ9w7Y d3BRKd9Zx38TzD8YdUMHSK05rlOUIkryyAg8DXFRGWT5BBh5ckcfOtt8pzhv+lzCM6AGrp7WH fPkh5ONjD+2YacYtWXzz5yH1C4fzMV69HqAvwFJuuwsu3O5gMxGo0nvnz+Gp3xeyHXX/w/dGz TxGbUnLc+zaC+VgGrUGC2oeWh/Zov9HIs1HkEvXCqcMW+Dtw+E6nyDxJS6i7U7bDadDCH+tgR byCmQKRgrdF1HTRyrSQDx9rHp1sgvGqhSW/vcyZcK4bCdTe/deeouy/6XcuatzEwcTylU9/li vuAMcz5/uRnPU= X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, GIT_PATCH_0, KAM_NUMSUBJECT, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Harald Anlauf via Gcc-patches From: Harald Anlauf Reply-To: Harald Anlauf Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" Dear all, the patch is almost self-explaining. We mishandled the case of initializing pointer components to derived types of type CHARACTER via DATA, which screwed up both legal and illegal uses. The attached patch fixes that, and checks that the legal cases work. Regtests cleanly on x86_64-pc-linux-gnu. OK for master? As it is a regression, I intend to backport as seems applicable. (As one part of the patch partially reverts sth. that was part of commit eb401400f59e4d1f28bbdc788c3234e0968081d7 Author: Andre Vehreschild Date: Wed Dec 14 12:52:09 2016 +0100 re PR fortran/78672 (Gfortran test suite failures with a sanitized compiler) I'd be glad if somebody else cross-checks on a different platform.) Thanks, Harald PR93685 - ICE in gfc_constructor_append_expr, at fortran/constructor.c:135 Fix handling of F2018 enhancements to DATA statements that allows initialization of pointer components to derived types, and adjust error handling for the CHARACTER case. gcc/fortran/ChangeLog: * data.c (gfc_assign_data_value): Restrict use of create_character_initializer to constant initializers. * trans-expr.c (gfc_conv_initializer): Ensure that character initializer is constant, otherwise fall through to get the same error handling as for non-character cases. gcc/testsuite/ChangeLog: * gfortran.dg/pr93685_1.f90: New test. * gfortran.dg/pr93685_2.f90: New test. diff --git a/gcc/fortran/data.c b/gcc/fortran/data.c index 3e52a5717b5..76ddd9dab7f 100644 --- a/gcc/fortran/data.c +++ b/gcc/fortran/data.c @@ -546,12 +546,11 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index, return false; } - if (ref || last_ts->type == BT_CHARACTER) + if (ref || (last_ts->type == BT_CHARACTER + && rvalue->expr_type == EXPR_CONSTANT)) { /* An initializer has to be constant. */ - if (rvalue->expr_type != EXPR_CONSTANT - || (lvalue->ts.u.cl->length == NULL - && !(ref && ref->u.ss.length != NULL))) + if (lvalue->ts.u.cl->length == NULL && !(ref && ref->u.ss.length != NULL)) return false; expr = create_character_initializer (init, last_ts, ref, rvalue); } diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index bfe08be2a94..f66afab85d1 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -7877,12 +7877,14 @@ gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type, return se.expr; case BT_CHARACTER: - { - tree ctor = gfc_conv_string_init (ts->u.cl->backend_decl,expr); - TREE_STATIC (ctor) = 1; - return ctor; - } + if (expr->expr_type == EXPR_CONSTANT) + { + tree ctor = gfc_conv_string_init (ts->u.cl->backend_decl, expr); + TREE_STATIC (ctor) = 1; + return ctor; + } + /* Fallthrough. */ default: gfc_init_se (&se, NULL); gfc_conv_constant (&se, expr); diff --git a/gcc/testsuite/gfortran.dg/pr93685_1.f90 b/gcc/testsuite/gfortran.dg/pr93685_1.f90 new file mode 100644 index 00000000000..34d6e2cf355 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr93685_1.f90 @@ -0,0 +1,20 @@ +! { dg-do run } +! PR93685 - ICE in gfc_constructor_append_expr, at fortran/constructor.c:135 + +program p + implicit none + type t + character, pointer :: a + end type t + type u + integer, pointer :: i + end type u + type(t) :: x + type(u) :: y + character, target :: c = 'c' + integer , target :: i = 10 + data x%a /c/ + data y%i /i/ + if (x% a /= "c") stop 1 + if (y% i /= 10) stop 2 +end diff --git a/gcc/testsuite/gfortran.dg/pr93685_2.f90 b/gcc/testsuite/gfortran.dg/pr93685_2.f90 new file mode 100644 index 00000000000..2e3ef5a62fd --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr93685_2.f90 @@ -0,0 +1,18 @@ +! { dg-do compile } +! PR93685 - ICE in gfc_constructor_append_expr, at fortran/constructor.c:135 + +program p + implicit none + type t + character :: a + end type t + type u + integer :: i + end type u + type(t) :: x + type(u) :: y + character, target :: c = 'c' + integer , target :: i = 10 + data x%a /c/ ! { dg-error "non-constant initialization expression"} + data y%i /i/ ! { dg-error "non-constant initialization expression"} +end