[gcc/devel/omp/gcc-9] backport: re PR fortran/91424 (Extend warnings about DO loops)

Tobias Burnus burnus@gcc.gnu.org
Thu Mar 5 13:52:00 GMT 2020


https://gcc.gnu.org/g:17adf232a0445577ec0b14b0ca890edaee8abb7a

commit 17adf232a0445577ec0b14b0ca890edaee8abb7a
Author: Thomas Koenig <tkoenig@gcc.gnu.org>
Date:   Tue Aug 13 10:05:44 2019 +0000

    backport: re PR fortran/91424 (Extend warnings about DO loops)
    
    2019-08-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
    
    	Backport from trunk
    	PR fortran/91424
    	* frontend-passes.c (do_subscript): Do not warn for an
    	expression a second time.  Do not warn about a zero-trip loop.
    	(doloop_warn): Also look at contained namespaces.
    
    2019-08-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
    
    	Backport from trunk
    	PR fortran/91424
    	* gfortran.dg/do_subscript_3.f90: New test.
    	* gfortran.dg/do_subscript_4.f90: New test.
    	* gfortran.dg/pr70754.f90: Use indices that to not overflow.
    
    2019-08-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
    
    	Backport from trunk
    	PR fortran/91422
    	* testsuite/libgomp.oacc-fortran/routine-7.f90: Correct array
    	dimension.
    
    From-SVN: r274369

Diff:
---
 gcc/fortran/ChangeLog                              |  8 ++++++++
 gcc/fortran/frontend-passes.c                      | 24 +++++++++++++++++++++-
 gcc/testsuite/ChangeLog                            |  8 ++++++++
 gcc/testsuite/gfortran.dg/do_subscript_3.f90       | 22 ++++++++++++++++++++
 gcc/testsuite/gfortran.dg/do_subscript_4.f90       | 11 ++++++++++
 gcc/testsuite/gfortran.dg/pr70754.f90              | 13 ++++++------
 libgomp/ChangeLog                                  |  7 +++++++
 .../testsuite/libgomp.oacc-fortran/routine-7.f90   |  2 +-
 8 files changed, 87 insertions(+), 8 deletions(-)

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index ef90ba0..bcc3a0b 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,11 @@
+2019-08-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+	Backport from trunk
+	PR fortran/91424
+	* frontend-passes.c (do_subscript): Do not warn for an
+	expression a second time.  Do not warn about a zero-trip loop.
+	(doloop_warn): Also look at contained namespaces.
+
 2019-08-12  Steven G. Kargl  <kargl@gcc.gnu.org>
 
 	PR fortran/91359
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c
index d4264da..75b2d05 100644
--- a/gcc/fortran/frontend-passes.c
+++ b/gcc/fortran/frontend-passes.c
@@ -2557,6 +2557,12 @@ do_subscript (gfc_expr **e)
   if (in_assoc_list)
     return 0;
 
+  /* We already warned about this.  */
+  if (v->do_not_warn)
+    return 0;
+
+  v->do_not_warn = 1;
+
   for (ref = v->ref; ref; ref = ref->next)
     {
       if (ref->type == REF_ARRAY && ref->u.ar.type == AR_ELEMENT)
@@ -2609,7 +2615,6 @@ do_subscript (gfc_expr **e)
 	      else
 		have_do_start = false;
 
-
 	      if (dl->ext.iterator->end->expr_type == EXPR_CONSTANT)
 		{
 		  have_do_end = true;
@@ -2621,6 +2626,17 @@ do_subscript (gfc_expr **e)
 	      if (!have_do_start && !have_do_end)
 		return 0;
 
+	      /* No warning inside a zero-trip loop.  */
+	      if (have_do_start && have_do_end)
+		{
+		  int sgn, cmp;
+
+		  sgn = mpz_cmp_ui (do_step, 0);
+		  cmp = mpz_cmp (do_end, do_start);
+		  if ((sgn > 0 && cmp < 0) || (sgn < 0 && cmp > 0))
+		    break;
+		}
+
 	      /* May have to correct the end value if the step does not equal
 		 one.  */
 	      if (have_do_start && have_do_end && mpz_cmp_ui (do_step, 1) != 0)
@@ -2762,6 +2778,12 @@ static void
 doloop_warn (gfc_namespace *ns)
 {
   gfc_code_walker (&ns->code, doloop_code, do_function, NULL);
+
+  for (ns = ns->contained; ns; ns = ns->sibling)
+    {
+      if (ns->code == NULL || ns->code->op != EXEC_BLOCK)
+	doloop_warn (ns);
+    }
 }
 
 /* This selction deals with inlining calls to MATMUL.  */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8f4b121..463baa6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2019-08-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+	Backport from trunk
+	PR fortran/91424
+	* gfortran.dg/do_subscript_3.f90: New test.
+	* gfortran.dg/do_subscript_4.f90: New test.
+	* gfortran.dg/pr70754.f90: Use indices that to not overflow.
+
 2019-08-12  Steven G. Kargl  <kargl@gcc.gnu.org>
 
 	PR fortran/91359
diff --git a/gcc/testsuite/gfortran.dg/do_subscript_3.f90 b/gcc/testsuite/gfortran.dg/do_subscript_3.f90
new file mode 100644
index 0000000..2f62f58
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/do_subscript_3.f90
@@ -0,0 +1,22 @@
+! { dg-do compile }
+! PR fortran/91424
+! Check that only one warning is issued inside blocks, and that
+! warnings are also issued for contained subroutines.
+
+program main
+  real :: a(5)
+  block
+    integer :: j
+    do j=0, 5  ! { dg-warning "out of bounds" }
+       a(j) = 2. ! { dg-warning "out of bounds" }
+    end do
+  end block
+  call x
+contains
+  subroutine x
+    integer :: i
+    do i=1,6 ! { dg-warning "out of bounds" }
+       a(i) = 2.  ! { dg-warning "out of bounds" }
+    end do
+  end subroutine x
+end program main
diff --git a/gcc/testsuite/gfortran.dg/do_subscript_4.f90 b/gcc/testsuite/gfortran.dg/do_subscript_4.f90
new file mode 100644
index 0000000..c773fe7
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/do_subscript_4.f90
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! PR 91424 - this used to warn although the DO loop is zero trip.
+program main
+  implicit none
+  integer :: i
+  real :: a(2)
+  do i=1,3,-1
+     a(i) = 2.
+  end do
+  print *,a
+end program main
diff --git a/gcc/testsuite/gfortran.dg/pr70754.f90 b/gcc/testsuite/gfortran.dg/pr70754.f90
index d7e790c..593acf9 100644
--- a/gcc/testsuite/gfortran.dg/pr70754.f90
+++ b/gcc/testsuite/gfortran.dg/pr70754.f90
@@ -18,12 +18,13 @@ contains
     integer (ii4), dimension(40,40) :: c
     integer  i, j
 
-    do i=1,20
-      b(i,j) = 123 * a(i,j) + 34 * a(i,j+1) &
-             + 34 * a(i,j-1) + a(i+1,j+1) &
-             + a(i+1,j-1) + a(i-1,j+1) &
-             + a(i-1,j-1)
-      c(i,j) = 123
+    j = 10
+    do i=11,30
+       b(i,j) = 123 * a(i,j) + 34 * a(i,j+1) &
+            + 34 * a(i,j-1) + a(i+1,j+1) &
+            + a(i+1,j-1) + a(i-1,j+1) &
+            + a(i-1,j-1)
+       c(i,j) = 123
     end do
 
     where ((xyz(:,:,2) /= 0) .and. (c /= 0))
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 958572a..15d1287 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,10 @@
+2019-08-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+	Backport from trunk
+	PR fortran/91422
+	* testsuite/libgomp.oacc-fortran/routine-7.f90: Correct array
+	dimension.
+
 2019-08-12  Release Manager
 
 	* GCC 9.2.0 released.
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/routine-7.f90 b/libgomp/testsuite/libgomp.oacc-fortran/routine-7.f90
index f58a95f..1009f4a 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/routine-7.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/routine-7.f90
@@ -109,7 +109,7 @@ end subroutine gang
 
 subroutine seq (a)
   !$acc routine seq
-  integer, intent (inout) :: a(M)
+  integer, intent (inout) :: a(N)
   integer :: i
 
   do i = 1, N



More information about the Gcc-cvs mailing list