diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2014-03-27 22:21:35 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2014-03-27 22:21:35 +0000 |
commit | 4f83d583ec0c13d691a6a9ee320bf7c0dbf3def4 (patch) | |
tree | cebb84214434f32beb6ba833206c3ebc26b7ad9e | |
parent | 6788164be4fa931697fa68ffd016cbe1876c959a (diff) | |
download | gcc-4f83d583ec0c13d691a6a9ee320bf7c0dbf3def4.zip gcc-4f83d583ec0c13d691a6a9ee320bf7c0dbf3def4.tar.gz gcc-4f83d583ec0c13d691a6a9ee320bf7c0dbf3def4.tar.bz2 |
re PR fortran/60522 (WHERE construct causes an ICE in gfc_trans_where_2)
2014-04-27 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/60522
* frontend-passes.c (cfe_code): Do not walk subtrees
for WHERE.
2014-04-27 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/60522
* gfortran.dg/where_4.f90: New test case.
From-SVN: r208883
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/frontend-passes.c | 27 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/where_4.f90 | 18 |
4 files changed, 54 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ab70231..cc683ca 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2014-04-27 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/60522 + * frontend-passes.c (cfe_code): Do not walk subtrees + for WHERE. + 2014-03-27 Tobias Burnus <burnus@net-b.de> PR fortran/58880 diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index e663868..6c67e66 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 03a617b..8cfbfc3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-27 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/60522 + * gfortran.dg/where_4.f90: New test case. + 2014-03-27 Tobias Burnus <burnus@net-b.de> 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 0000000..1ff2e4c --- /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 |