From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) by sourceware.org (Postfix) with ESMTPS id 4FBB23858D37; Thu, 31 Aug 2023 20:42:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4FBB23858D37 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=1693514575; x=1694119375; i=anlauf@gmx.de; bh=Je835WXeinkANOnvieflA9Xw9qs2yPilZ1wMSxFWG5Q=; h=X-UI-Sender-Class:From:To:Subject:Date; b=XXUdykND8XmVSriQEc16VJGYHYyPCJk97QptPBF4GBV3ThZwRhmy+wgQq9oxKgfYb2hrVaQ J4wykaOv39XDQ3ZVGYFzbL1QrO+H9JiB4qV3lD3VSWRBxOVhYxobbyABKd2aVprN34zPW6bUe H3hYgDyPK8KTo6Q5cF544xELY/KSdHdgS2+F1PkrKeLddgj7Ltvy2geVZVbZVCnOOJ5w9/xRR akDec2EhesM9z75UAYq/ditw5cniyG0GrlOZv4C7Ivu7htY8cGaBujnaOoWqGFOUM2HWMj9nP uiExsZq5fY4d/NEz9UohlC2D+s3/mjP8ZriVzdzsrKlD7Zpj4qHQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from [79.232.156.250] ([79.232.156.250]) by web-mail.gmx.net (3c-app-gmx-bap28.server.lan [172.19.172.98]) (via HTTP); Thu, 31 Aug 2023 22:42:55 +0200 MIME-Version: 1.0 Message-ID: From: Harald Anlauf To: fortran , gcc-patches Subject: [PATCH] Fortran: runtime bounds-checking in presence of array constructors [PR31059] Content-Type: multipart/mixed; boundary=kenitram-b1f491dd-901e-4ad4-8816-a2afdc70c6d2 Date: Thu, 31 Aug 2023 22:42:55 +0200 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:LsdnHlCQJATi9Yxr7GIRNQEMp2YmZPugiJ4RVaJPFyuju/nFostAcobM7sPuF94JcC/nq OAxFwqhtToeSS7/Aovat21jwQSo0bNM3M6wpIizDfvUBl09l0udT52a68osYfcmionpnGrBY/s9D aauWwj2MOjQ4uLw3KBG8xEn4/gR2b1SdylLBCRRjd9mt9fjcXQyW5LhS0OR79o1Cdxa4Bt48sr0y VquTZxLSbc/TvqWytpPmEcLyfOiyzNM5F+objJsdGvseDbJe6R4OnGS6nhLJmln76gfmGgT3fEga SM= UI-OutboundReport: notjunk:1;M01:P0:QtdXehkSwMU=;vO5YKqCkRuMk1Wfc4YYhoeWcAZF Y8Dmzhpcl5/ekTQg1LPYWNs87bJkpKis9z19ihZMKn6Z3QjUXjkoOLFHryQUmSEouoEaqPngB ib3mOMpl+uBjGaZzq8i9IhI582LpwnrPhCprtnU/i0fvBWFvovnz1IlVagbd8OdfICc77AwPM iknsntY+EFkkNYoj3Iscn2opdY8T3Z0t689/ELR5+xWT4c2P9mCjH5K2+TFcpJ4XkVC72Q/mn Y9MA51VYLzK/lA4jU2+Q68fhh+60XkLrAeYir8EiHBCA7UBRkZStey4pDt9heBAm0XAtiQMV4 G+TSBaY5J8J5t3Vh3evRKNUaDCSzIEUvJMlFK5YaVS359CIV3pOYCqqXhBYMGVxMe3vT3Evnh Oer/GAwvK1mM52aWeIpGBPNxxc2ig+bLd2VgWxatyHS9s0mP9CIcfEr1BnvM8nT7zNThHyWeE gaildFe4ybrcKcvFSEN7cpPKJ0+rAwBmq3ruEKh5m9eZL+AEup39ILhn88HsSiRR58kX7xgxR PEpRHBxDiwM43oLsscBOxc+6brGq1vi96GVmp2LoHqqoy4563rMDaIk+ZQo8VUy+iH85TPJwL nbJPAVXxy0Q+bxUpBDXw/TT1gXqWojZGcHe3QYzCIH9P7sXkoMpVjxgdqwj+rUPtb2kkN+xdI s3r7uZgBP3uA2VPKHfrF/x/Kf2LoH3jWXp1XuDH4Us87byjFFz9od5qJKln9oVLs/93/0dwZB cOLA00slrl4VZXOWZn7XPxS5dA9Newt9q5p+GjAlmI4+ppmZLDRdE0CWAxu0+wFqOxfTt0UMa CPqIsLAmY3KLH8fjuPZHP/AA== 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,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS,TXREP 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: --kenitram-b1f491dd-901e-4ad4-8816-a2afdc70c6d2 Content-Type: text/plain; charset=UTF-8 Dear all, gfortran's array bounds-checking code does a mostly reasonable job for array sections in expressions and assignments, but forgot the case that (rank-1) expressions can involve array constructors, which have a shape ;-) The attached patch walks over the loops generated by the scalarizer, checks for the presence of a constructor, and takes the first shape found as reference. (If several constructors are present, discrepancies in their shape seems to be already detected at compile time). For more details on what will be caught now see testcase. Regtested on x86_64-pc-linux-gnu. OK for mainline? Thanks, Harald --kenitram-b1f491dd-901e-4ad4-8816-a2afdc70c6d2 Content-Type: text/x-patch Content-Disposition: attachment; filename=pr31059.diff Content-Transfer-Encoding: quoted-printable =46rom 944a35909e8eeb79c92e398ae3f27e94708584e6 Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Thu, 31 Aug 2023 22:19:58 +0200 Subject: [PATCH] Fortran: runtime bounds-checking in presence of array constructors [PR31059] gcc/fortran/ChangeLog: PR fortran/31059 * trans-array.cc (gfc_conv_ss_startstride): For array bounds checking, consider also array constructors in expressions, and use their shape. gcc/testsuite/ChangeLog: PR fortran/31059 * gfortran.dg/bounds_check_fail_5.f90: New test. =2D-- gcc/fortran/trans-array.cc | 23 ++++++++++++++++ .../gfortran.dg/bounds_check_fail_5.f90 | 26 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/bounds_check_fail_5.f90 diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 90a7d4e9aef..6ca58e98547 100644 =2D-- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -4740,6 +4740,29 @@ done: for (n =3D 0; n < loop->dimen; n++) size[n] =3D NULL_TREE; + /* If there is a constructor involved, derive size[] from its shape= . */ + for (ss =3D loop->ss; ss !=3D gfc_ss_terminator; ss =3D ss->loop_ch= ain) + { + gfc_ss_info *ss_info; + + ss_info =3D ss->info; + info =3D &ss_info->data.array; + + if (ss_info->type =3D=3D GFC_SS_CONSTRUCTOR && info->shape) + { + for (n =3D 0; n < loop->dimen; n++) + { + if (size[n] =3D=3D NULL) + { + gcc_assert (info->shape[n]); + size[n] =3D gfc_conv_mpz_to_tree (info->shape[n], + gfc_index_integer_kind); + } + } + break; + } + } + for (ss =3D loop->ss; ss !=3D gfc_ss_terminator; ss =3D ss->loop_ch= ain) { stmtblock_t inner; diff --git a/gcc/testsuite/gfortran.dg/bounds_check_fail_5.f90 b/gcc/tests= uite/gfortran.dg/bounds_check_fail_5.f90 new file mode 100644 index 00000000000..436cc96621d =2D-- /dev/null +++ b/gcc/testsuite/gfortran.dg/bounds_check_fail_5.f90 @@ -0,0 +1,26 @@ +! { dg-do run } +! { dg-additional-options "-fcheck=3Dbounds -g -fdump-tree-original" } +! { dg-output "At line 13 .*" } +! { dg-shouldfail "Array bound mismatch for dimension 1 of array 'ivec' (= 2/3)" } +! +! PR fortran/31059 - runtime bounds-checking in presence of array constru= ctors + +program p + integer :: jvec(3) =3D [1,2,3] + integer, allocatable :: ivec(:), kvec(:), lvec(:), mvec(:), nvec(:) + ivec =3D [1,2] ! (re)allocation + kvec =3D [4,5,6] ! (re)allocation + ivec(:) =3D [4,5,6] ! runtime error (->dump) + ! not reached ... + print *, jvec + [1,2,3] ! OK & no check generated + print *, [4,5,6] + jvec ! OK & no check generated + print *, lvec + [1,2,3] ! check generated (->dump) + print *, [4,5,6] + mvec ! check generated (->dump) + nvec(:) =3D jvec ! check generated (->dump) +end + +! { dg-final { scan-tree-dump-times "Array bound mismatch " 4 "original" = } } +! { dg-final { scan-tree-dump-times "Array bound mismatch .*ivec" 1 "orig= inal" } } +! { dg-final { scan-tree-dump-times "Array bound mismatch .*lvec" 1 "orig= inal" } } +! { dg-final { scan-tree-dump-times "Array bound mismatch .*mvec" 1 "orig= inal" } } +! { dg-final { scan-tree-dump-times "Array bound mismatch .*nvec" 1 "orig= inal" } } =2D- 2.35.3 --kenitram-b1f491dd-901e-4ad4-8816-a2afdc70c6d2--