From patchwork Wed Jun 15 20:26:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harald Anlauf X-Patchwork-Id: 55112 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 879D93857424 for ; Wed, 15 Jun 2022 20:26:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 879D93857424 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1655324815; bh=LpeJJVRQ2yEpuqFgrKXS964qu/mKR6UZnEj3LSVGiOo=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Z0GHbeQzoI8WUd/uKWmuf65Kl75haHsTEO/Kfi7IA0sZokirRqSfpRF/D6rO1u8uB hwhVJhGNqeLOuaR7XC2LB/87Th0dCrKPTpsSImvEmlsHgkFBCAVUcWJdp4VaqQeEwe gHSphDOdE6FNyDqaKKsRi7RY27xvuw29RWcfRS8k= 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.22]) by sourceware.org (Postfix) with ESMTPS id ADF643858D32; Wed, 15 Jun 2022 20:26:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org ADF643858D32 X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [93.207.88.200] ([93.207.88.200]) by web-mail.gmx.net (3c-app-gmx-bap59.server.lan [172.19.172.129]) (via HTTP); Wed, 15 Jun 2022 22:26:20 +0200 MIME-Version: 1.0 Message-ID: To: fortran , gcc-patches Subject: [PATCH] Fortran: check POS and LEN arguments simplifying bit intrinsics [PR105986] Date: Wed, 15 Jun 2022 22:26:20 +0200 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:rQXjZmLfPNGx4giWgP7/1eQAksrPfw1RA7kATuYZgLlJXdCsxLtU1JecJfiXQXhwTX5Rg /h42xL1DjZ+9enpWmHEwP3lyfETrXApWgvQBc8KvQ7BmrBFWJbDeNyspGfeGhYrqroseAyDthUu5 mQkhZpSG52jCiJpL4JuqIhnKTjGriHXPIIQ62YTusC1/w9WwgpDv5eI9JmTWREgHbRJGHgLPqBed sM1Jkc8UyYpquGi+LF8hk0OHCr7bt+ZKV3dqp21nfFEGcBeb0qLy4HGeheonUzRa3sw2YwRiMUzL lY= X-UI-Out-Filterresults: notjunk:1;V03:K0:bModabA+sic=:m91FUpoDj1Kw0ZhCl0gVAY PTZk26bP/MywJqaDRkeF0XhXSv70qQYGVfc9e374nmTtkxVtzBv5Hz3DYIaZ90wmPZfNaf8+j iYRPC6q2TGeSrypq8LYTc/DjTEJKjbkxE8t3Z8aEv8rCCq7BrRcfVPIOYH8/BvIjTtuTpuxM/ nlPcPl1Q/M8yLl5Z4T5flY67F0HY05l97e/RegF9zHNPCI+bBeX0HHw8FENRkMUfzKFvJeU9r n4ThgzvEhherAl09A6QgbGPI1LxSpEKpNkmJoDPCQ75qFrWVYc0YCfpAFI58KMOxMw3QkJw6L DKxW2om6QVJIoqVoc5OMDkWVKfXyxFKlNtxzqzTs91++Lk1f9xSdozzQi7BEfNtdLQ9RH/9sS SrHfoIPe4YfBBQBjFIoi4jkCDDhXf1+Ip2w0ITG4GRIzSL3e8C9J4FhzOtaxLRbsjG69KpjCU 3YjTiL1pEnu2UYq3sEak6JGQ672paLSycA76PXMp3g7xHojD3HK7PP5uZ3tXKSAChS3EXLgxu QOmNOyQQ5DIN61yi8K+uYNajZG9XMjfv7d9OlKhdoVgbYG7jOvMp/UTGTas+5KU4coBtSDW/q jPdNl8avZzpnLgwU9fGf+lOa+Q35UPrNfu81QKHoK7wdDLVMOYbiotp544lfnpWFGTgDjHzHS Uy9gSWjwauaJwIMdSKfpr+7oWDHJBGg5hzmQlRsADH8HDKz9A8diIKXbRugSYiGDrX6x123tS Y6yzR2QGR5q6IT6oBFuRbQRrBTxfElgB1sRgeW/9UxKvXqXkxm+yUuJBiXRTsZoVg6+RecK3D xGBesGu X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, 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 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+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Dear all, we need to check the POS (and LEN) arguments of bit intrinsics when simplifying, e.g. when used in array constructors. Otherwise we ICE. Found by Gerhard. The fix is straightforward, see attached. Regtested on x86_64-pc-linux-gnu. OK for mainline? Thanks, Harald From 32c95012378ada5ce555a819dbc640e1dd2b88d5 Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Wed, 15 Jun 2022 22:20:09 +0200 Subject: [PATCH] Fortran: check POS and LEN arguments simplifying bit intrinsics [PR105986] gcc/fortran/ChangeLog: PR fortran/105986 * simplify.cc (gfc_simplify_btest): Add check for POS argument. (gfc_simplify_ibclr): Add check for POS argument. (gfc_simplify_ibits): Add check for POS and LEN arguments. (gfc_simplify_ibset): Add check for POS argument. gcc/testsuite/ChangeLog: PR fortran/105986 * gfortran.dg/check_bits_3.f90: New test. --- gcc/fortran/simplify.cc | 12 ++++++++++++ gcc/testsuite/gfortran.dg/check_bits_3.f90 | 16 ++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/check_bits_3.f90 diff --git a/gcc/fortran/simplify.cc b/gcc/fortran/simplify.cc index 233cc42137f..c8f2ef9fbf4 100644 --- a/gcc/fortran/simplify.cc +++ b/gcc/fortran/simplify.cc @@ -1644,6 +1644,9 @@ gfc_simplify_btest (gfc_expr *e, gfc_expr *bit) if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT) return NULL; + if (!gfc_check_bitfcn (e, bit)) + return &gfc_bad_expr; + if (gfc_extract_int (bit, &b) || b < 0) return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false); @@ -3353,6 +3356,9 @@ gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y) if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) return NULL; + if (!gfc_check_bitfcn (x, y)) + return &gfc_bad_expr; + gfc_extract_int (y, &pos); k = gfc_validate_kind (x->ts.type, x->ts.kind, false); @@ -3384,6 +3390,9 @@ gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z) || z->expr_type != EXPR_CONSTANT) return NULL; + if (!gfc_check_ibits (x, y, z)) + return &gfc_bad_expr; + gfc_extract_int (y, &pos); gfc_extract_int (z, &len); @@ -3438,6 +3447,9 @@ gfc_simplify_ibset (gfc_expr *x, gfc_expr *y) if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) return NULL; + if (!gfc_check_bitfcn (x, y)) + return &gfc_bad_expr; + gfc_extract_int (y, &pos); k = gfc_validate_kind (x->ts.type, x->ts.kind, false); diff --git a/gcc/testsuite/gfortran.dg/check_bits_3.f90 b/gcc/testsuite/gfortran.dg/check_bits_3.f90 new file mode 100644 index 00000000000..3018e6977ef --- /dev/null +++ b/gcc/testsuite/gfortran.dg/check_bits_3.f90 @@ -0,0 +1,16 @@ +! { dg-do compile } +! PR fortran/105986 +! Contributed by G.Steinmetz + +program p + integer :: i + logical, parameter :: a(*) = [(btest(8_4,i), i=-1,-1)] ! { dg-error "nonnegative" } + integer, parameter :: b(*) = [(ibclr(8_4,i), i=-1,-1)] ! { dg-error "nonnegative" } + integer, parameter :: c(*) = [(ibset(8_4,i), i=-1,-1)] ! { dg-error "nonnegative" } + logical, parameter :: d(*) = [(btest(8_1,i), i= 8, 8)] ! { dg-error "must be less" } + integer, parameter :: e(*) = [(ibclr(8_2,i), i=16,16)] ! { dg-error "must be less" } + integer, parameter :: f(*) = [(ibset(8_4,i), i=32,32)] ! { dg-error "must be less" } + integer, parameter :: g(*) = [(ibits(8_4,i,1),i=-1,-1)] ! { dg-error "nonnegative" } + integer, parameter :: h(*) = [(ibits(8_4,1,i),i=-1,-1)] ! { dg-error "nonnegative" } + integer, parameter :: j(*) = [(ibits(8_4,i,i),i=32,32)] ! { dg-error "must be less" } +end -- 2.35.3