From: Thomas Koenig Date: Sat, 29 Mar 2014 11:51:17 +0000 (+0000) Subject: re PR fortran/60522 (WHERE construct causes an ICE in gfc_trans_where_2) X-Git-Tag: releases/gcc-4.7.4~171 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=67a4e630bd5406ff8ed79ea376e4f1ffb43d97ad;p=thirdparty%2Fgcc.git re PR fortran/60522 (WHERE construct causes an ICE in gfc_trans_where_2) 2014-04-29 Thomas Koenig PR fortran/60522 * frontend-passes.c (cfe_code): Do not walk subtrees for WHERE. 2014-04-29 Thomas Koenig PR fortran/60522 * gfortran.dg/where_4.f90: New test case. From-SVN: r208934 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index a56f12043b78..35a1bf3837ac 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2014-04-29 Thomas Koenig + + PR fortran/60522 + * frontend-passes.c (cfe_code): Do not walk subtrees + for WHERE. + 2014-03-20 Tobias Burnus PR fortran/60543 diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index acfb14d069f4..05ecd20a874e 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -442,12 +442,35 @@ cfe_expr_0 (gfc_expr **e, int *walk_subtrees, 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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7e77479ca2ff..e6f2832f45a7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-29 Thomas Koenig + + PR fortran/60522 + * gfortran.dg/where_4.f90: New test case. + 2014-03-20 Tobias Burnus PR fortran/60543 diff --git a/gcc/testsuite/gfortran.dg/where_4.f90 b/gcc/testsuite/gfortran.dg/where_4.f90 new file mode 100644 index 000000000000..1ff2e4ca31ab --- /dev/null +++ b/gcc/testsuite/gfortran.dg/where_4.f90 @@ -0,0 +1,18 @@ +! { 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