aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-array.c
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2008-05-16 21:12:04 +0000
committerPaul Thomas <pault@gcc.gnu.org>2008-05-16 21:12:04 +0000
commitae772c2de32aad49c4142f82af3596d70f2ce3a3 (patch)
tree1093b61ac07227cf4b57472af9c0dc65b46ec8a1 /gcc/fortran/trans-array.c
parenta4cd1610eacd66049c22244a1d38e024d57af989 (diff)
downloadgcc-ae772c2de32aad49c4142f82af3596d70f2ce3a3.zip
gcc-ae772c2de32aad49c4142f82af3596d70f2ce3a3.tar.gz
gcc-ae772c2de32aad49c4142f82af3596d70f2ce3a3.tar.bz2
re PR fortran/35756 (incorrect WHERE for functions in ELSEWHERE and overlaps)
2008-05-16 Paul Thomas <pault@gcc.gnu.org> PR fortran/35756 PR fortran/35759 * trans-stmt.c (gfc_trans_where): Tighten up the dependency check for calling gfc_trans_where_3. PR fortran/35743 * trans-stmt.c (gfc_trans_where_2): Set the mask size to zero if it is calculated to be negative. PR fortran/35745 * trans-stmt.c (gfc_trans_where_3, gfc_trans_where_assign): Set ss->where for scalar right hand sides. * trans-array.c (gfc_add_loop_ss_code): If ss->where is set do not evaluate scalars outside the loop. Clean up whitespace. * trans.h : Add a bitfield 'where' to gfc_ss. 2008-05-16 Paul Thomas <pault@gcc.gnu.org> PR fortran/35756 PR fortran/35759 * gfortran.dg/where_1.f90: New test. PR fortran/35743 PR fortran/35745 * gfortran.dg/where_2.f90: New test. From-SVN: r135443
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r--gcc/fortran/trans-array.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index d6464ca..784f1bc 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -1900,20 +1900,21 @@ gfc_add_loop_ss_code (gfc_loopinfo * loop, gfc_ss * ss, bool subscript)
/* Scalar expression. Evaluate this now. This includes elemental
dimension indices, but not array section bounds. */
gfc_init_se (&se, NULL);
- gfc_conv_expr (&se, ss->expr);
- gfc_add_block_to_block (&loop->pre, &se.pre);
+ gfc_conv_expr (&se, ss->expr);
+ gfc_add_block_to_block (&loop->pre, &se.pre);
- if (ss->expr->ts.type != BT_CHARACTER)
- {
- /* Move the evaluation of scalar expressions outside the
- scalarization loop. */
- if (subscript)
- se.expr = convert(gfc_array_index_type, se.expr);
- se.expr = gfc_evaluate_now (se.expr, &loop->pre);
- gfc_add_block_to_block (&loop->pre, &se.post);
- }
- else
- gfc_add_block_to_block (&loop->post, &se.post);
+ if (ss->expr->ts.type != BT_CHARACTER)
+ {
+ /* Move the evaluation of scalar expressions outside the
+ scalarization loop, except for WHERE assignments. */
+ if (subscript)
+ se.expr = convert(gfc_array_index_type, se.expr);
+ if (!ss->where)
+ se.expr = gfc_evaluate_now (se.expr, &loop->pre);
+ gfc_add_block_to_block (&loop->pre, &se.post);
+ }
+ else
+ gfc_add_block_to_block (&loop->post, &se.post);
ss->data.scalar.expr = se.expr;
ss->string_length = se.string_length;