From: Thomas Koenig Date: Tue, 2 Jan 2018 23:03:11 +0000 (+0000) Subject: backport: re PR fortran/83650 (Wrong simplification in cshift with negative shifts) X-Git-Tag: releases/gcc-6.5.0~613 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d72b97244038dffad86df70281bd4e23c2b21d0c;p=thirdparty%2Fgcc.git backport: re PR fortran/83650 (Wrong simplification in cshift with negative shifts) 2018-01-02 Thomas Koenig Backport from 7-branch PR fortran/83650 * simplify.c (gfc_simplify_cshift): Correct contition for negative shifts. 2018-01-02 Thomas Koenig Backport from 7-branch PR fortran/83650 * gfortran.dg/simplify_cshift_1.f90: Correct condition. From-SVN: r256113 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f278002b90a2..18d014e02937 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2018-01-02 Thomas Koenig + + Backport from 7-branch + PR fortran/83650 + * simplify.c (gfc_simplify_cshift): Correct contition for + negative shifts. + 2017-11-13 Paul Thomas Backport from trunk diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 37c04e9bf27d..ea7a74644213 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -1839,7 +1839,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 9cd07f37dd9e..89d3c776dff4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-01-02 Thomas Koenig + + Backport from 7-branch + PR fortran/83650 + * gfortran.dg/simplify_cshift_1.f90: Correct condition. + 2017-12-14 Peter Bergner Backport from mainline diff --git a/gcc/testsuite/gfortran.dg/simplify_cshift_1.f90 b/gcc/testsuite/gfortran.dg/simplify_cshift_1.f90 index dbe67f4c8e9a..3eb5adb49c81 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.