From 52535f91db79d02151d9237c9ef45a482396865c Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Tue, 2 Jan 2018 18:01:31 +0000 Subject: [PATCH] re PR fortran/83650 (Wrong simplification in cshift with negative shifts) 2018-01-02 Thomas Koenig PR fortran/83650 * simplify.c (gfc_simplify_cshift): Correct contition for negative shifts. 2018-01-02 Thomas Koenig PR fortran/83650 * gfortran.dg/simplify_cshift_1.f90: Correct condition. From-SVN: r256085 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/simplify.c | 4 +++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/simplify_cshift_1.f90 | 4 ++-- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 8c6f28b5f73..46c3207df41 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2018-01-02 Thomas Koenig + + PR fortran/83650 + * simplify.c (gfc_simplify_cshift): Correct contition for + negative shifts. + 2017-12-28 Steven G. Kargl PR Fortran/83548 diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 169aef1d892..0078dd9950b 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -1991,7 +1991,9 @@ gfc_simplify_cshift (gfc_expr *array, gfc_expr *shift, gfc_expr *dim) mpz_clear (size); /* Adjust shft to deal with right or left shifts. */ - shft = shft < 0 ? 1 - shft : shft; + shft = shft % sz; + if (shft < 0) + shft += sz; /* Special case: Shift to the original order! */ if (sz == 0 || shft % sz == 0) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a9973897519..d2a588719f7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-01-02 Thomas Koenig + + PR fortran/83650 + * gfortran.dg/simplify_cshift_1.f90: Correct condition. + 2018-01-01 Jakub Jelinek PR middle-end/83608 diff --git a/gcc/testsuite/gfortran.dg/simplify_cshift_1.f90 b/gcc/testsuite/gfortran.dg/simplify_cshift_1.f90 index dbe67f4c8e9..3eb5adb49c8 100644 --- a/gcc/testsuite/gfortran.dg/simplify_cshift_1.f90 +++ b/gcc/testsuite/gfortran.dg/simplify_cshift_1.f90 @@ -23,12 +23,12 @@ program foo v = cshift(c, 2) if (any(b /= v)) call abort - ! Special cases shift = 0, size(a), 1-size(a) + ! Special cases shift = 0, size(a), size(a) b = cshift([1, 2, 3, 4, 5], 0) if (any(b /= a)) call abort b = cshift([1, 2, 3, 4, 5], size(a)) if (any(b /= a)) call abort - b = cshift([1, 2, 3, 4, 5], 1-size(a)) + b = cshift([1, 2, 3, 4, 5], -size(a)) if (any(b /= a)) call abort ! simplification of array arg.