From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2071) id C816B3858C2C; Thu, 30 Sep 2021 19:12:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C816B3858C2C 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 r9-9750] Fortran - out of bounds in array constructor with implied do loop X-Act-Checkin: gcc X-Git-Author: Harald Anlauf X-Git-Refname: refs/heads/releases/gcc-9 X-Git-Oldrev: 3a70195d7da49fe793ce3eb0e839b9ceea96c97a X-Git-Newrev: 97a5a41dbfef1722fdaf4dc979e8b9c274b4404d Message-Id: <20210930191226.C816B3858C2C@sourceware.org> Date: Thu, 30 Sep 2021 19:12:26 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Sep 2021 19:12:26 -0000 https://gcc.gnu.org/g:97a5a41dbfef1722fdaf4dc979e8b9c274b4404d commit r9-9750-g97a5a41dbfef1722fdaf4dc979e8b9c274b4404d Author: Harald Anlauf Date: Thu Sep 9 21:34:01 2021 +0200 Fortran - out of bounds in array constructor with implied do loop gcc/fortran/ChangeLog: PR fortran/98490 * trans-expr.c (gfc_conv_substring): Do not generate substring bounds check for implied do loop index variable before it actually becomes defined. gcc/testsuite/ChangeLog: PR fortran/98490 * gfortran.dg/bounds_check_23.f90: New test. (cherry picked from commit 5fe0865ab788bdc387b284a3ad57e5a95a767b18) Diff: --- gcc/fortran/trans-expr.c | 4 +++- gcc/testsuite/gfortran.dg/bounds_check_23.f90 | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 722149493b6..e240441ac2c 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -2531,7 +2531,9 @@ gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind, if (!CONSTANT_CLASS_P (tmp) && !DECL_P (tmp)) end.expr = gfc_evaluate_now (end.expr, &se->pre); - if (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS) + if ((gfc_option.rtcheck & GFC_RTCHECK_BOUNDS) + && (ref->u.ss.start->symtree + && !ref->u.ss.start->symtree->n.sym->attr.implied_index)) { tree nonempty = fold_build2_loc (input_location, LE_EXPR, logical_type_node, start.expr, diff --git a/gcc/testsuite/gfortran.dg/bounds_check_23.f90 b/gcc/testsuite/gfortran.dg/bounds_check_23.f90 new file mode 100644 index 00000000000..8de90c77c01 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/bounds_check_23.f90 @@ -0,0 +1,18 @@ +! { dg-do run } +! { dg-options "-fcheck=bounds -fdump-tree-original" } +! PR fortran/98490 - out of bounds in array constructor with implied do loop + +program test + implicit none + call sub('Lorem ipsum') +contains + subroutine sub( text ) + character(len=*), intent(in) :: text + character(len=1), allocatable :: c(:) + integer :: i + c = [ ( text(i:i), i = 1, len(text) ) ] + if (c(1) /= 'L') stop 1 + end subroutine sub +end program test + +! { dg-final { scan-tree-dump-times "Substring out of bounds:" 2 "original" } }