]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Fix -Wshift-count-overflow warning in std::bitset
authorJonathan Wakely <jwakely@redhat.com>
Sat, 20 Jan 2024 21:09:28 +0000 (21:09 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 31 Jan 2024 09:42:38 +0000 (09:42 +0000)
This shift only happens if the unsigned long long type is wider than
unsigned long but the compiler warns when it sees the shift, without
caring if it's reachable.

Use the preprocessor to compare the sizes and just reuse _M_to_ulong()
if sizeof(long) == sizeof(long long).

libstdc++-v3/ChangeLog:

* include/std/bitset (_Base_bitset::_M_do_to_ullong): Avoid
-Wshift-count-overflow warning.

libstdc++-v3/include/std/bitset

index c169269698a9b6ca9ca7c95b4dbbcdaa0b1e4245..3243c6497314fd4f7e4b1c7909cb9e82df4a70dc 100644 (file)
@@ -320,17 +320,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     _GLIBCXX14_CONSTEXPR unsigned long long
     _Base_bitset<_Nw>::_M_do_to_ullong() const
     {
-      const bool __dw = sizeof(unsigned long long) > sizeof(unsigned long);
-      for (size_t __i = 1 + __dw; __i < _Nw; ++__i)
+#if __SIZEOF_LONG_LONG__ == __SIZEOF_LONG__
+      return _M_do_to_ulong();
+#else
+      for (size_t __i = 2; __i < _Nw; ++__i)
        if (_M_w[__i])
          __throw_overflow_error(__N("_Base_bitset::_M_do_to_ullong"));
 
-      if (__dw)
-       return _M_w[0] + (static_cast<unsigned long long>(_M_w[1])
+      return _M_w[0] + (static_cast<unsigned long long>(_M_w[1])
                          << _GLIBCXX_BITSET_BITS_PER_WORD);
-      return _M_w[0];
-    }
 #endif
+    }
+#endif // C++11
 
   template<size_t _Nw>
     _GLIBCXX14_CONSTEXPR size_t