aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/frontend-passes.c
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2021-07-06 07:04:09 +0200
committerThomas Koenig <tkoenig@gcc.gnu.org>2021-07-06 07:04:09 +0200
commitd7e3855d5dd8c001bb65dc7da1cda0249bfc2986 (patch)
treebcc5ce81885138f5d5c6f024ea217edb60cbf100 /gcc/fortran/frontend-passes.c
parentc64d15224c6dc4dc3b6b3c2c6b6fd5c7e0e9c072 (diff)
downloadgcc-d7e3855d5dd8c001bb65dc7da1cda0249bfc2986.zip
gcc-d7e3855d5dd8c001bb65dc7da1cda0249bfc2986.tar.gz
gcc-d7e3855d5dd8c001bb65dc7da1cda0249bfc2986.tar.bz2
Do not replace variable op variable in I/O implied DO loop replacement.
This PR came about because index expressions of the form k+k in implied DO loops in I/O statements were considered for replacement by array slices. Fixed by only doing the transformation if the expression is of the type expr OP contastant. gcc/fortran/ChangeLog: PR fortran/100227 * frontend-passes.c (traverse_io_block): Adjust test for when a variable is eligible for the transformation to array slice. gcc/testsuite/ChangeLog: PR fortran/100227 * gfortran.dg/implied_do_io_7.f90: New test.
Diffstat (limited to 'gcc/fortran/frontend-passes.c')
-rw-r--r--gcc/fortran/frontend-passes.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c
index 72a4e04..996dcc2 100644
--- a/gcc/fortran/frontend-passes.c
+++ b/gcc/fortran/frontend-passes.c
@@ -1299,8 +1299,8 @@ traverse_io_block (gfc_code *code, bool *has_reached, gfc_code *prev)
std::swap (start->value.op.op1, start->value.op.op2);
gcc_fallthrough ();
case INTRINSIC_MINUS:
- if ((start->value.op.op1->expr_type!= EXPR_VARIABLE
- && start->value.op.op2->expr_type != EXPR_CONSTANT)
+ if (start->value.op.op1->expr_type!= EXPR_VARIABLE
+ || start->value.op.op2->expr_type != EXPR_CONSTANT
|| start->value.op.op1->ref)
return false;
if (!stack_top || !stack_top->iter