https://gcc.gnu.org/g:32457bc25fea80b7bfb2f572e3e163b1dc359969

commit r15-7647-g32457bc25fea80b7bfb2f572e3e163b1dc359969
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Thu Feb 13 09:40:44 2025 +0000

    libstdc++: Fix invalid signed arguments to <bit> functions
    
    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.

Diff:
---
 libstdc++-v3/include/experimental/bits/simd.h | 2 +-
 libstdc++-v3/src/c++17/floating_from_chars.cc | 5 +++--
 libstdc++-v3/src/c++17/memory_resource.cc     | 3 ++-
 3 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/libstdc++-v3/include/experimental/bits/simd.h 
b/libstdc++-v3/include/experimental/bits/simd.h
index 500c1781ae54..f0cb101aaa82 100644
--- a/libstdc++-v3/include/experimental/bits/simd.h
+++ b/libstdc++-v3/include/experimental/bits/simd.h
@@ -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>();
diff --git a/libstdc++-v3/src/c++17/floating_from_chars.cc 
b/libstdc++-v3/src/c++17/floating_from_chars.cc
index f8b1e23937d2..d48f1c0d4545 100644
--- a/libstdc++-v3/src/c++17/floating_from_chars.cc
+++ b/libstdc++-v3/src/c++17/floating_from_chars.cc
@@ -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'.
diff --git a/libstdc++-v3/src/c++17/memory_resource.cc 
b/libstdc++-v3/src/c++17/memory_resource.cc
index 0e984f27b827..fac4c782c5f7 100644
--- a/libstdc++-v3/src/c++17/memory_resource.cc
+++ b/libstdc++-v3/src/c++17/memory_resource.cc
@@ -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)

Reply via email to