Fix std::__rotl and std::__rotr
authorJonathan Wakely <jwakely@redhat.com>
Wed, 4 Jul 2018 14:31:56 +0000 (15:31 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 4 Jul 2018 14:31:56 +0000 (15:31 +0100)
2018-07-04  Jonathan Wakely  <jwakely@redhat.com>
    Jakub Jelinek  <jakub@redhat.com>

* include/std/bit (__rotl, __rotr): Fix for non-power of two sizes.

Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r262414

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/bit

index fa92b4bb489d71489772d6453b0b53b7be920809..b1747e82cb8559f625b2c4b606148c128d32969b 100644 (file)
@@ -1,3 +1,8 @@
+2018-07-04  Jonathan Wakely  <jwakely@redhat.com>
+           Jakub Jelinek  <jakub@redhat.com>
+
+       * include/std/bit (__rotl, __rotr): Fix for non-power of two sizes.
+
 2018-07-04  Jonathan Wakely  <jwakely@redhat.com>
 
        PR libstdc++/86398
index ace889540307366ba953c654ab978bca8be2fb3e..a23f2ba60d13ec71b54add473de9162987e17662 100644 (file)
@@ -46,7 +46,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     {
       constexpr auto _Nd = numeric_limits<_Tp>::digits;
       const unsigned __sN = __s % _Nd;
-      return (__x << __sN) | (__x >> ((-__sN) % _Nd));
+      return (__x << __sN) | (__x >> ((_Nd - __sN) % _Nd));
     }
 
   template<typename _Tp>
@@ -55,7 +55,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     {
       constexpr auto _Nd = numeric_limits<_Tp>::digits;
       const unsigned __sN = __s % _Nd;
-      return (__x >> __sN) | (__x << ((-__sN) % _Nd));
+      return (__x >> __sN) | (__x << ((_Nd - __sN) % _Nd));
     }
 
   template<typename _Tp>