From acd1559a0e07edca7e130e5fbc2d230ac8ba841c Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Sat, 14 Apr 2018 13:38:41 +0000 Subject: re PR fortran/85387 (incorrect output with optimization /= 0) 2018-04-14 Thomas Koenig 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 PR fortran/85387 * gfortran.dg/implied_do_io_5.f90: New test. From-SVN: r259384 --- gcc/fortran/frontend-passes.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'gcc/fortran/frontend-passes.c') diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 6888224..40e88b1 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -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. */ new_e = gfc_copy_expr (curr->expr1); new_e->expr_type = EXPR_VARIABLE; -- cgit v1.1