From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) by sourceware.org (Postfix) with ESMTPS id 669523858D35; Wed, 28 Jun 2023 20:44:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 669523858D35 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmx.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1687985065; x=1688589865; i=anlauf@gmx.de; bh=zwjWQNVVPeTHKQgRaf1gxoZ3Fpbmv3M+kNHa5mX186M=; h=X-UI-Sender-Class:From:To:Subject:Date; b=S2d6vY8mI7eDFtlNC3c5/xvfOcuyubinUdOZJz9jHPsHIHA6uWieiN2LxJmLGG5q1JE+7Bk xfXIhNxS+RUX2SDRPXNIauYcFtH1fNJKAOFQeN73gC7j3lX2z+R78NrcP2bFc3tgusyO6gcUN VGyR6L1FiM5kbGWw8awk/R+27D749A4r3ZzMBWirshH/Qbom0vzx/nxLmkBWHJ3vmIkeernIm yOlkYprnGZChUyr35lusVCzaVyICJStJjQ6ReCF9tJh4UXAq84ztOCdMeqz3LtCN4C/3r7J// FOnqgOBXob5Fl1lfibfxpWgzEJKPixDH641jcIxr1GntGYmBT02A== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from [93.207.80.85] ([93.207.80.85]) by web-mail.gmx.net (3c-app-gmx-bs03.server.lan [172.19.170.52]) (via HTTP); Wed, 28 Jun 2023 22:44:25 +0200 MIME-Version: 1.0 Message-ID: From: Harald Anlauf To: fortran , gcc-patches Subject: [PATCH, part3, committed] Fortran: ABI for scalar CHARACTER(LEN=1),VALUE dummy argument [PR110360] Content-Type: multipart/mixed; boundary=rehcsed-f5bcdce1-c5b1-4e5b-95fd-1ec365359431 Date: Wed, 28 Jun 2023 22:44:25 +0200 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:rEwBPH4SeErWzAFYd2aq2VAASDanOyess+8Y/QZUu9jMZg+e4RemU3V4ukLDuy0Mfn6EK u2zSnh3c9ETFKEe+JKi87PzuxksSXmxzwdcvhLvbWkXMRixBQYhTMYA7H/xIc2leNgYIPcwx+M4T r7l60lCn2rQS5nUl5JnygwprDbfOUOm3zWWAeegwBfRJ1/bFN+P9Zj9I/A+yV7zD8z0bmjzKeD5W JINpCeQaSk2ih6PpQA4szezUJWJMKCuwjWO5fbh1VQ5zDg9lBx7yvw4rGvJEEoY7RAtjNNp1tmH5 PU= UI-OutboundReport: notjunk:1;M01:P0:Gl3fpcaER08=;rEgXkj+bSRVGGHeTpWqCgS+2/+Y ITlq+uO5LARikgh2axAkjS7a6PmXc2By1EmCyRL1dy95EdYWDXZ27EiRvhxefKMZE9BNpyPda hpkp/rU4LdbAOKPdfNSxVOKNnA7C2TQhP3pycK8T/47pYX/Zn2UdT6Y2yN4CbN/eRwtEbgxQd dq9ZeJVsPrsLBtPXXDouE3FgV5gx58kivEbyxLRLUdXua5DxBkR2qw47CcxDCt2ckSRxpdjq9 XIUvzl9X29WBk7uHqT9KDdfK07pcB7s1Vg9D7FbONReXElMSDoBZyj7JY0fgzNmaBu3wZ6vcP 83IKnVlhbYlkr8h1G/5qim4J5jcCyfmo7L6U4dLqHvGg7dAm8BghIH8PNOK8HTDQQhvtUZAcZ +1tUX3tpGkbAym6dLMiK8uuynGSdjHy2CRt1bDMp7ekifPFghOHMDgnNA7puBXhPU1DNVoLse YWws8FB32duo652SRbh+vxbgTj0AEf1+b7bdespElL4xb/MI8Wi79bIW+smm8GdZ94gbs2+0j 5LO6lYsb/RTDcI/ia8UOuMFlYxvmtKEpYAAAo7I15KPXwesVJphgfn0oZXuTr1NVKLwXDTjSY dtQ/Jg5nMUk8Io6GknJ89Z1Im5bDftajwHG2eKF+CHLT/qJxONS4Pi2f2ABB3w0mzeWFdn+QZ Z5nw1j85CQ80vW85XzWFVr2N820ZknV7LEjQW2lhOiqrta/60sH5NdrmkZINleMITVHSnJwu1 bMqrclkqi3eJ0kw0jm+MBYm+RQtGqP5zAWNr130uECsR3F3hByk4AXrGdTQVO7LCvJWoA7LTY 41Gxr48h4pnQAKesXc/KXreg== X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --rehcsed-f5bcdce1-c5b1-4e5b-95fd-1ec365359431 Content-Type: text/plain; charset=UTF-8 Dear all, the previous patches to this PR unfortunately caused a regression, seen on Power big-endian systems/-m32 (pr110419), and while trying to investigate on x86 also showed a regression (ICE) on cases that were not covered in the testsuite before. The original fix did not properly handle the dereferencing of string arguments that were not constant, and it was lacking the truncation of strings to length one that is needed when passing a character on the stack. This patch has been regtested on x86_64-pc-linux-gnu, and the extended testcase was scrutinized with -m64 and -m32. Pushed after discussion in the PR with Mikael as commit r14-2171-g8736d6b14a4dfdfb58c80ccd398981b0fb5d00aa https://gcc.gnu.org/g:8736d6b14a4dfdfb58c80ccd398981b0fb5d00aa Will keep the PR open as long as the issues on Power big-endian are not confirmed resolved. Thanks, Harald --rehcsed-f5bcdce1-c5b1-4e5b-95fd-1ec365359431 Content-Type: text/x-patch Content-Disposition: attachment; filename=pr110360-part3.diff Content-Transfer-Encoding: quoted-printable =46rom 8736d6b14a4dfdfb58c80ccd398981b0fb5d00aa Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Wed, 28 Jun 2023 22:16:18 +0200 Subject: [PATCH] Fortran: ABI for scalar CHARACTER(LEN=3D1),VALUE dummy ar= gument [PR110360] gcc/fortran/ChangeLog: PR fortran/110360 * trans-expr.cc (gfc_conv_procedure_call): For non-constant string argument passed to CHARACTER(LEN=3D1),VALUE dummy, ensure proper dereferencing and truncation of string to length 1. gcc/testsuite/ChangeLog: PR fortran/110360 * gfortran.dg/value_9.f90: Add tests for intermediate regression. =2D-- gcc/fortran/trans-expr.cc | 15 ++++++++++----- gcc/testsuite/gfortran.dg/value_9.f90 | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index ad0cdf902ba..30946ba3f63 100644 =2D-- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -6395,7 +6395,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * s= ym, /* ABI: actual arguments to CHARACTER(len=3D1),VALUE dummy arguments are actually passed by value. - Constant strings are truncated to length 1. + Strings are truncated to length 1. The BIND(C) case is handled elsewhere. */ if (fsym->ts.type =3D=3D BT_CHARACTER && !fsym->ts.is_c_interop @@ -6405,10 +6405,15 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol *= sym, (fsym->ts.u.cl->length->value.integer, 1) =3D=3D 0)) { if (e->expr_type !=3D EXPR_CONSTANT) - parmse.expr =3D gfc_string_to_single_character - (build_int_cst (gfc_charlen_type_node, 1), - parmse.expr, - e->ts.kind); + { + tree slen1 =3D build_int_cst (gfc_charlen_type_node, 1); + gfc_conv_string_parameter (&parmse); + parmse.expr =3D gfc_string_to_single_character (slen1, + parmse.expr, + e->ts.kind); + /* Truncate resulting string to length 1. */ + parmse.string_length =3D slen1; + } else if (e->value.character.length > 1) { e->value.character.length =3D 1; diff --git a/gcc/testsuite/gfortran.dg/value_9.f90 b/gcc/testsuite/gfortra= n.dg/value_9.f90 index f6490645e27..1a2fa80ed0d 100644 =2D-- a/gcc/testsuite/gfortran.dg/value_9.f90 +++ b/gcc/testsuite/gfortran.dg/value_9.f90 @@ -9,7 +9,12 @@ program p character (kind=3D4), allocatable :: ca4 character (kind=3D4), pointer :: cp4 character(len=3D:,kind=3D4), allocatable :: cd4 + character :: c =3D "1" + character (kind=3D4) :: c4 =3D 4_"4" + character(len=3D3) :: d =3D "210" + character(len=3D3,kind=3D4) :: d4 =3D 4_"321" integer :: a =3D 65 + integer :: l =3D 2 allocate (ca, cp, ca4, cp4) ! Check len=3D1 actual argument cases first @@ -20,15 +25,21 @@ program p call val ("A",char(a)) call val ("A",mychar(65)) call val ("A",mychar(a)) + call val ("1",c) + call val ("1",(c)) call val4 (4_"C",4_"C") call val4 (4_"A",char(65,kind=3D4)) call val4 (4_"A",char(a, kind=3D4)) + call val4 (4_"4",c4) + call val4 (4_"4",(c4)) call val (ca,ca) call val (cp,cp) call val (cd,cd) + call val (ca,(ca)) call val4 (ca4,ca4) call val4 (cp4,cp4) call val4 (cd4,cd4) + call val4 (cd4,(cd4)) call sub ("S") call sub4 (4_"T") @@ -37,6 +48,18 @@ program p call val4 (4_"V**",4_"V//") call sub ( "WTY") call sub4 (4_"ZXV") + call val ( "234", d ) + call val4 (4_"345", d4 ) + call val ( "234", (d) ) + call val4 (4_"345", (d4) ) + call val ( "234", d (1:2)) + call val4 (4_"345", d4(1:2)) + call val ( "234", d (1:l)) + call val4 (4_"345", d4(1:l)) + call val ("1",c // d) + call val ("1",trim (c // d)) + call val4 (4_"4",c4 // d4) + call val4 (4_"4",trim (c4 // d4)) cd =3D "gkl"; cd4 =3D 4_"hmn" call val (cd,cd) call val4 (cd4,cd4) =2D- 2.35.3 --rehcsed-f5bcdce1-c5b1-4e5b-95fd-1ec365359431--