+2014-04-29 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/60522
+ * frontend-passes.c (cfe_code): Do not walk subtrees
+ for WHERE.
+
2014-03-20 Tobias Burnus <burnus@net-b.de>
PR fortran/60543
to insert statements as needed. */
static int
-cfe_code (gfc_code **c, int *walk_subtrees ATTRIBUTE_UNUSED,
- void *data ATTRIBUTE_UNUSED)
+cfe_code (gfc_code **c, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
{
current_code = c;
inserted_block = NULL;
changed_statement = NULL;
+
+ /* Do not do anything inside a WHERE statement; scalar assignments, BLOCKs
+ and allocation on assigment are prohibited inside WHERE, and finally
+ masking an expression would lead to wrong-code when replacing
+
+ WHERE (a>0)
+ b = sum(foo(a) + foo(a))
+ END WHERE
+
+ with
+
+ WHERE (a > 0)
+ tmp = foo(a)
+ b = sum(tmp + tmp)
+ END WHERE
+*/
+
+ if ((*c)->op == EXEC_WHERE)
+ {
+ *walk_subtrees = 0;
+ return 0;
+ }
+
+
return 0;
}
+2014-04-29 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/60522
+ * gfortran.dg/where_4.f90: New test case.
+
2014-03-20 Tobias Burnus <burnus@net-b.de>
PR fortran/60543
--- /dev/null
+! { dg-do compile }
+! PR 60522 - this used to ICE.
+! Original test case Roger Ferrer Ibanez
+subroutine foo(a, b)
+ implicit none
+ integer, dimension(:), intent(inout) :: a
+ integer, dimension(:), intent(in) :: b
+
+ where (b(:) > 0)
+ where (b(:) > 100)
+ a(lbound(a, 1):ubound(a, 1)) = b(lbound(b, 1):ubound(b, 1)) * b(lbound(b, 1):ubound(b, 1)) - 100
+ elsewhere
+ a(lbound(a, 1):ubound(a, 1)) = b(lbound(b, 1):ubound(b, 1)) * b(lbound(b, 1):ubound(b, 1))
+ end where
+ elsewhere
+ a(lbound(a, 1):ubound(a, 1)) = - b(lbound(b, 1):ubound(b, 1)) * b(lbound(b, 1):ubound(b, 1))
+ end where
+end subroutine foo