From 4f83d583ec0c13d691a6a9ee320bf7c0dbf3def4 Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Thu, 27 Mar 2014 22:21:35 +0000 Subject: [PATCH] re PR fortran/60522 (WHERE construct causes an ICE in gfc_trans_where_2) 2014-04-27 Thomas Koenig PR fortran/60522 * frontend-passes.c (cfe_code): Do not walk subtrees for WHERE. 2014-04-27 Thomas Koenig PR fortran/60522 * gfortran.dg/where_4.f90: New test case. From-SVN: r208883 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/frontend-passes.c | 27 +++++++++++++++++++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/where_4.f90 | 18 ++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/where_4.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ab702313d47..cc683ca4bcc 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2014-04-27 Thomas Koenig + + PR fortran/60522 + * frontend-passes.c (cfe_code): Do not walk subtrees + for WHERE. + 2014-03-27 Tobias Burnus PR fortran/58880 diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index e663868d3ce..6c67e66108b 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -627,12 +627,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 03a617b4a43..8cfbfc3c7fc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-27 Thomas Koenig + + PR fortran/60522 + * gfortran.dg/where_4.f90: New test case. + 2014-03-27 Tobias Burnus PR fortran/58880 diff --git a/gcc/testsuite/gfortran.dg/where_4.f90 b/gcc/testsuite/gfortran.dg/where_4.f90 new file mode 100644 index 00000000000..1ff2e4ca31a --- /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 -- 2.30.2