From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2071) id 31BCD3858CDA; Sat, 21 Oct 2023 19:51:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 31BCD3858CDA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1697917910; bh=KaHOo358R0kDKGIVPBs+KmhnHkGweVjMfua+fGNMBpQ=; h=From:To:Subject:Date:From; b=BjLW2oOca0YLXXFe9CxJ9TcmCMWsH7bK/UPvI8GtSu+JFHmp8JW5oiffsOyZagZ7W Juw2B+4DKL6BNJR06AmhKDXm/oogbr6GaLUxz0CH0lp5ir+Tp2kl7FF2LmHNVKUuU/ GnI4A/jlvXD/uWVIZbfLBTHzqReZZxSSwCFNS1Qg= 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 r13-7972] Fortran: out of bounds access with nested implied-do IO [PR111837] X-Act-Checkin: gcc X-Git-Author: Harald Anlauf X-Git-Refname: refs/heads/releases/gcc-13 X-Git-Oldrev: 59047d969f1e1a6c224ae3f5f9bd69a9445cdad0 X-Git-Newrev: c83907b9fad802a5c38ed4ca75d9415b8f57f619 Message-Id: <20231021195150.31BCD3858CDA@sourceware.org> Date: Sat, 21 Oct 2023 19:51:50 +0000 (GMT) List-Id: https://gcc.gnu.org/g:c83907b9fad802a5c38ed4ca75d9415b8f57f619 commit r13-7972-gc83907b9fad802a5c38ed4ca75d9415b8f57f619 Author: Harald Anlauf Date: Mon Oct 16 21:02:20 2023 +0200 Fortran: out of bounds access with nested implied-do IO [PR111837] gcc/fortran/ChangeLog: PR fortran/111837 * frontend-passes.cc (traverse_io_block): Dependency check of loop nest shall be triangular, not banded. gcc/testsuite/ChangeLog: PR fortran/111837 * gfortran.dg/implied_do_io_8.f90: New test. (cherry picked from commit 5ac63ec5da2e93226457bea4dbb3a4f78d5d82c2) Diff: --- gcc/fortran/frontend-passes.cc | 2 +- gcc/testsuite/gfortran.dg/implied_do_io_8.f90 | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gcc/fortran/frontend-passes.cc b/gcc/fortran/frontend-passes.cc index 904289820232..85ebca56a69f 100644 --- a/gcc/fortran/frontend-passes.cc +++ b/gcc/fortran/frontend-passes.cc @@ -1326,7 +1326,7 @@ traverse_io_block (gfc_code *code, bool *has_reached, gfc_code *prev) if (iters[i]) { gfc_expr *var = iters[i]->var; - for (int j = i - 1; j < i; j++) + for (int j = 0; j < i; j++) { if (iters[j] && (var_in_expr (var, iters[j]->start) diff --git a/gcc/testsuite/gfortran.dg/implied_do_io_8.f90 b/gcc/testsuite/gfortran.dg/implied_do_io_8.f90 new file mode 100644 index 000000000000..c66a0f6fde66 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/implied_do_io_8.f90 @@ -0,0 +1,18 @@ +! { dg-do run } +! { dg-additional-options "-fcheck=bounds" } +! PR fortran/111837 - out of bounds access with front-end optimization + +program implied_do_bug + implicit none + integer :: i,j,k + real :: arr(1,1,1) + integer :: ni(1) + ni(1) = 1 + arr = 1 + write(*,*) (((arr(i,j,k), i=1,ni(k)), k=1,1), j=1,1) + write(*,*) (((arr(i,j,k), i=1,ni(k)), j=1,1), k=1,1) + write(*,*) (((arr(k,i,j), i=1,ni(k)), k=1,1), j=1,1) + write(*,*) (((arr(k,i,j), i=1,ni(k)), j=1,1), k=1,1) + write(*,*) (((arr(j,k,i), i=1,ni(k)), k=1,1), j=1,1) + write(*,*) (((arr(j,k,i), i=1,ni(k)), j=1,1), k=1,1) +end