]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Fix invalid signed arguments to <bit> functions
authorJonathan Wakely <jwakely@redhat.com>
Thu, 13 Feb 2025 09:40:44 +0000 (09:40 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 20 Feb 2025 11:33:41 +0000 (11:33 +0000)
These should have been unsigned, but the static assertions are only in
the public std::bit_ceil and std::bit_width functions, not the internal
__bit_ceil and __bit_width ones.

libstdc++-v3/ChangeLog:

* include/experimental/bits/simd.h (__find_next_valid_abi): Cast
__bit_ceil argument to unsigned.
* src/c++17/floating_from_chars.cc (__floating_from_chars_hex):
Cast __bit_ceil argument to unsigned.
* src/c++17/memory_resource.cc (big_block): Cast __bit_width
argument to unsigned.

libstdc++-v3/include/experimental/bits/simd.h
libstdc++-v3/src/c++17/floating_from_chars.cc
libstdc++-v3/src/c++17/memory_resource.cc

index 500c1781ae5410d563f776b1aadf2f9fb865256a..f0cb101aaa82f5944b52d29024083795f52c6838 100644 (file)
@@ -4634,7 +4634,7 @@ template <template <int> class _Abi, int _Bytes, typename _Tp>
     static constexpr auto
     _S_choose()
     {
-      constexpr int _NextBytes = std::__bit_ceil(_Bytes) / 2;
+      constexpr int _NextBytes = std::__bit_ceil((unsigned)_Bytes) / 2;
       using _NextAbi = _Abi<_NextBytes>;
       if constexpr (_NextBytes < sizeof(_Tp) * 2) // break recursion
        return _Abi<_Bytes>();
index f8b1e23937d2d54b3708e036280b000b753d3b74..d48f1c0d45453e5ddda333ed6b3de454f7689c64 100644 (file)
@@ -1102,8 +1102,9 @@ namespace
       {
        // If the leading hexit is not '1', shift MANTISSA to make it so.
        // This normalizes input like "4.08p0" into "1.02p2".
-       const int leading_hexit = mantissa >> mantissa_bits;
-       const int leading_hexit_width = __bit_width(leading_hexit); // FIXME: optimize?
+       const unsigned leading_hexit = mantissa >> mantissa_bits;
+       const int leading_hexit_width
+         = __bit_width((unsigned)leading_hexit); // FIXME: optimize?
        __glibcxx_assert(leading_hexit_width >= 1 && leading_hexit_width <= 4);
        shift_mantissa(leading_hexit_width - 1);
        // After this adjustment, we can assume the leading hexit is '1'.
index 0e984f27b8273862f7d67cb34ada49a63c698eec..fac4c782c5f72a28c418fdeb3b344d566a31b8c0 100644 (file)
@@ -591,7 +591,8 @@ namespace pmr
     // The minimum size of a big block.
     // All big_block allocations will be a multiple of this value.
     // Use bit_ceil to get a power of two even for e.g. 20-bit size_t.
-    static constexpr size_t min = __bit_ceil(numeric_limits<size_t>::digits);
+    static constexpr size_t min
+      = __bit_ceil((unsigned)numeric_limits<size_t>::digits);
 
     constexpr
     big_block(size_t bytes, size_t alignment)