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.
This commit is contained in:
Harald Anlauf 2021-09-09 21:34:01 +02:00
parent de515ce0b2
commit 5fe0865ab7
2 changed files with 21 additions and 1 deletions

View File

@ -2630,7 +2630,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,

View File

@ -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" } }