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 fa92b4b..b1747e8 100644 (file)
@@ -1,4 +1,9 @@
 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
        * include/std/type_traits (is_trivially_constructible): Check
index ace8895..a23f2ba 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>