aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2023-10-16 21:02:20 +0200
committerHarald Anlauf <anlauf@gmx.de>2023-10-17 18:55:22 +0200
commit5ac63ec5da2e93226457bea4dbb3a4f78d5d82c2 (patch)
tree91ea2baa5d5d95216ff0a31b2bfb4ae190c7857b /gcc
parent43c2f85f52c8400b7204e24400c52c3173c50735 (diff)
downloadgcc-5ac63ec5da2e93226457bea4dbb3a4f78d5d82c2.zip
gcc-5ac63ec5da2e93226457bea4dbb3a4f78d5d82c2.tar.gz
gcc-5ac63ec5da2e93226457bea4dbb3a4f78d5d82c2.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/frontend-passes.cc2
-rw-r--r--gcc/testsuite/gfortran.dg/implied_do_io_8.f9018
2 files changed, 19 insertions, 1 deletions
diff --git a/gcc/fortran/frontend-passes.cc b/gcc/fortran/frontend-passes.cc
index 136a292..536884b 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 0000000..c66a0f6
--- /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