aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2014-03-27 22:21:35 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2014-03-27 22:21:35 +0000
commit4f83d583ec0c13d691a6a9ee320bf7c0dbf3def4 (patch)
treecebb84214434f32beb6ba833206c3ebc26b7ad9e
parent6788164be4fa931697fa68ffd016cbe1876c959a (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/fortran/frontend-passes.c27
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/where_4.f9018
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