From cb40e8071e0fa1a86183f6b97ebeb3355e5e1722 Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Sun, 18 Nov 2018 17:40:23 +0000 Subject: [PATCH] re PR fortran/88073 (Internal compiler error compiling WHERE construct with -O or -O2) 2018-11-18 Thomas Koenig PR fortran/88073 * frontend-passes.c (combine_array_constructor): Do not do anything if in a WHERE statement. 2018-11-18 Thomas Koenig PR fortran/88073 * gfortran.dg/where_7.f90: New test. From-SVN: r266251 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/frontend-passes.c | 4 ++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/where_7.f90 | 25 +++++++++++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/where_7.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 83920ab8f6d..15f594265b0 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2018-11-18 Thomas Koenig + + PR fortran/88073 + * frontend-passes.c (combine_array_constructor): Do not do + anything if in a WHERE statement. + 2018-11-18 Thomas Koenig PR fortran/70260 diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 19930305bd1..9fa50ee68fa 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -1773,6 +1773,10 @@ combine_array_constructor (gfc_expr *e) if (iterator_level > 0) return false; + /* WHERE also doesn't work. */ + if (in_where > 0) + return false; + op1 = e->value.op.op1; op2 = e->value.op.op2; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 571618623e7..ffd271a8c3f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-11-18 Thomas Koenig + + PR fortran/88073 + * gfortran.dg/where_7.f90: New test. + 2018-11-18 Thomas Koenig PR fortran/70260 diff --git a/gcc/testsuite/gfortran.dg/where_7.f90 b/gcc/testsuite/gfortran.dg/where_7.f90 new file mode 100644 index 00000000000..1c79ef50553 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/where_7.f90 @@ -0,0 +1,25 @@ +! { dg-do compile } +! { dg-options "-ffrontend-optimize" } +! PR fortran/88073 - this used to ICE with front-end optimization +! Original test case by 'mecej4' +Subroutine tfu (n, x, f) + Implicit None + Integer, Parameter :: double = Kind (0.d0) + Integer, Intent (In) :: n + Real (double), Intent (Out) :: f + Real (double), Intent (In) :: x (n) + Integer :: j + Logical, Dimension(n) :: l1v, l2v, l3v +! + l3v = .False. + l2v = .False. + l1v = (/ (j, j=1, n) /) == 1 + Where ( .Not. (l1v)) + l2v = (/ (j, j=1, n) /) == n + End Where + Where ( .Not. l1v) + l3v = .Not. l2v + End Where + f = sum (x(1:n), mask=l3v) + Return +end subroutine tfu -- 2.30.2