Commit acd1559a by Thomas Koenig

re PR fortran/85387 (incorrect output with optimization /= 0)

2018-04-14  Thomas Koenig  <tkoenig@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  <tkoenig@gcc.gnu.org>

	PR fortran/85387
	* gfortran.dg/implied_do_io_5.f90: New test.

From-SVN: r259384
parent 4be91498
2018-04-14 Thomas Koenig <tkoenig@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-12 Thomas Koenig <tkoenig@gcc.gnu.org> 2018-04-12 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/83064 PR fortran/83064
......
...@@ -1237,6 +1237,23 @@ traverse_io_block (gfc_code *code, bool *has_reached, gfc_code *prev) ...@@ -1237,6 +1237,23 @@ traverse_io_block (gfc_code *code, bool *has_reached, gfc_code *prev)
} }
} }
/* 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. */ /* Create new expr. */
new_e = gfc_copy_expr (curr->expr1); new_e = gfc_copy_expr (curr->expr1);
new_e->expr_type = EXPR_VARIABLE; new_e->expr_type = EXPR_VARIABLE;
......
2018-04-14 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/85387
* gfortran.dg/implied_do_io_5.f90: New test.
2018-04-13 Paul A. Clarke <pc@us.ibm.com> 2018-04-13 Paul A. Clarke <pc@us.ibm.com>
PR target/83402 PR target/83402
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment