diff options
author | Harald Anlauf <anlauf@gmx.de> | 2024-01-19 21:20:44 +0100 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2024-01-19 21:20:44 +0100 |
commit | 94b2e6cb1cc4feb122bf77f19a657c97bffa9b42 (patch) | |
tree | 34440d1f54094c4948b968b85bcd17f32bb658ef /gcc | |
parent | 1338ad23ff3c1e4f552cdb64e36cef12eda2e050 (diff) | |
download | gcc-94b2e6cb1cc4feb122bf77f19a657c97bffa9b42.zip gcc-94b2e6cb1cc4feb122bf77f19a657c97bffa9b42.tar.gz gcc-94b2e6cb1cc4feb122bf77f19a657c97bffa9b42.tar.bz2 |
Fortran: fix wrong array bounds check [PR113471]
gcc/fortran/ChangeLog:
PR fortran/113471
* trans-array.cc (array_bound_check_elemental): Array bounds check
shall apply here to elemental dimensions of an array section only.
gcc/testsuite/ChangeLog:
PR fortran/113471
* gfortran.dg/bounds_check_24.f90: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/trans-array.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/bounds_check_24.f90 | 28 |
2 files changed, 29 insertions, 1 deletions
diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 26e7ada..878a92a 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -3600,7 +3600,7 @@ array_bound_check_elemental (gfc_se * se, gfc_ss * ss, gfc_expr * expr) continue; } - if (ref->type == REF_ARRAY && ref->u.ar.dimen > 0) + if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION) { ar = &ref->u.ar; for (dim = 0; dim < ar->dimen; dim++) diff --git a/gcc/testsuite/gfortran.dg/bounds_check_24.f90 b/gcc/testsuite/gfortran.dg/bounds_check_24.f90 new file mode 100644 index 0000000..d0251e8 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/bounds_check_24.f90 @@ -0,0 +1,28 @@ +! { dg-do compile } +! { dg-additional-options "-fcheck=bounds -fdump-tree-original" } +! +! PR fortran/113471 - wrong array bounds check + +program pr113471 + implicit none + type t + integer, dimension(2) :: c1 = 0 + end type t + type(t) :: cc(7), bb(7) + integer :: kk = 1 + + ! no bounds check (can be determined at compile time): + call foo (cc(7)% c1) + + ! bounds check involving kk, but no "outside of expected range" + call foo (bb(kk)% c1) + +contains + subroutine foo (c) + integer, intent(in) :: c(:) + end +end + +! { dg-final { scan-tree-dump-times "below lower bound" 2 "original" } } +! { dg-final { scan-tree-dump-times "above upper bound" 2 "original" } } +! { dg-final { scan-tree-dump-not "outside of expected range" "original" } } |