diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2008-05-16 21:12:04 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2008-05-16 21:12:04 +0000 |
commit | ae772c2de32aad49c4142f82af3596d70f2ce3a3 (patch) | |
tree | 1093b61ac07227cf4b57472af9c0dc65b46ec8a1 /gcc/fortran/trans-array.c | |
parent | a4cd1610eacd66049c22244a1d38e024d57af989 (diff) | |
download | gcc-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.c | 27 |
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; |