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