Hello world,

the attached patch fixes the PR, an 8 regression caused by
trying to convert a nested implied DO loop to an array
for a case where this was not possible.

Regression-tested. OK for trunk?

Regards

        Thomas

2018-04-14  Thomas Koenig  <tkoe...@gcc.gnu.org>

        PR fortran/85387
        * frontend-passes.c (traverse_io_block): Check for start, end or
        stride being defined by an outer implied DO loop.

2018-04-14  Thomas Koenig  <tkoe...@gcc.gnu.org>

        PR fortran/85387
        * gfortran.dg/implied_do_io_5.f90: New test.
Index: frontend-passes.c
===================================================================
--- frontend-passes.c	(Revision 259222)
+++ frontend-passes.c	(Arbeitskopie)
@@ -1237,6 +1237,23 @@ traverse_io_block (gfc_code *code, bool *has_reach
 	}
     }
 
+  /* Check for cases like ((a(i, j), i=1, j), j=1, 2). */
+  for (int i = 1; i < ref->u.ar.dimen; i++)
+    {
+      if (iters[i])
+	{
+	  gfc_expr *var = iters[i]->var;
+	  for (int j = i - 1; j < i; j++)
+	    {
+	      if (iters[j]
+		  && (gfc_check_dependency (var, iters[j]->start, true)
+		      || gfc_check_dependency (var, iters[j]->end, true)
+		      || gfc_check_dependency (var, iters[j]->step, true)))
+		  return false;
+	    }		  
+	}
+    }
+
   /* Create new expr.  */
   new_e = gfc_copy_expr (curr->expr1);
   new_e->expr_type = EXPR_VARIABLE;
! { dg-do  run }
! { dg-additional-options "-ffrontend-optimize" }
! PR fortran/85387 - incorrect output
! Original test case by Vittorio Zecca
program main
  real :: efg_pw(2,2)
  character (len=80) :: c1, c2
  efg_pw(1,1)=1
  efg_pw(2,1)=2
  efg_pw(1,2)=3
  efg_pw(2,2)=4
  write (unit=c1,fmt='(3F12.5)') ((efg_pw(i, j), i=1, j), j=1, 2)
  write (unit=c2,fmt='(3F12.5)') 1.0, 3.0, 4.0
  if (c1 /= c2) stop 1
end

Reply via email to