[committed] PR fortran/98490 - Unexpected out of bounds in array constructor with implied do loop

Message ID trinity-ea17d16b-c83e-498b-9308-2ba95ccb4694-1631216291451@3c-app-gmx-bs71
State New
Headers show
Series
  • [committed] PR fortran/98490 - Unexpected out of bounds in array constructor with implied do loop
Related show

Commit Message

Richard Biener via Gcc-patches Sept. 9, 2021, 7:38 p.m.
The following patch by Steve was lingering in the PR for some time.

For an implied do loop within an array constructor we would generate an
additional, bogus substring bounds check for the index variable before it
actually became defined.  The check thus depended on the previous value of
the index variable before the implied do loop.  The solution was to omit
that early check.

There is still a remaining check on the index variable, verified by manual
inspection and by counting the substring bounds checks in the dump tree.

Regtested on x86_64-pc-linux-gnu.  Committed after discussion with Steve.
The patch had also previously been approved by Paul.

Thanks,
Harald


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.

Patch

diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index c4291cce079..18d665192f0 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -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,
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" } }