On Thu, 20 Feb 2025 at 14:41, Patrick Palka <ppa...@redhat.com> wrote:
>
> On Sat, 15 Feb 2025, Jonathan Wakely wrote:
>
> > 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.
> > ---
> >
> > Tested x86_64-linux.
> >
> >  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?
>
> Not a big deal, but isn't this cast redundant if we've defined
> leading_hexit as unsigned?

You can never be too careful in C++! ;-)

Yes you're absolutely right. I think I added the cast at first, then
realised that I could just make the variable unsigned, but forgot to
undo the cast.

The attached patch reverts the cast part, just leaving the
s/int/unsigned/ part on the previous line.
commit ef1655d3c3caeac56cc9124a2479a5bfac90a239
Author:     Jonathan Wakely <jwak...@redhat.com>
AuthorDate: Thu Feb 20 15:16:11 2025
Commit:     Jonathan Wakely <r...@gcc.gnu.org>
CommitDate: Thu Feb 20 15:16:11 2025

    libstdc++: Remove redundant cast in floating_from_chars.cc
    
    In r15-7647-g32457bc25fea80 I added a cast and also changed the type of
    the variable, making the cast redundant. This removes the cast.
    
    libstdc++-v3/ChangeLog:
    
            * src/c++17/floating_from_chars.cc (__floating_from_chars_hex):
            Remove redundant cast.

diff --git a/libstdc++-v3/src/c++17/floating_from_chars.cc 
b/libstdc++-v3/src/c++17/floating_from_chars.cc
index d48f1c0d454..9bad12c7f69 100644
--- a/libstdc++-v3/src/c++17/floating_from_chars.cc
+++ b/libstdc++-v3/src/c++17/floating_from_chars.cc
@@ -1103,8 +1103,7 @@ namespace
        // If the leading hexit is not '1', shift MANTISSA to make it so.
        // This normalizes input like "4.08p0" into "1.02p2".
        const unsigned leading_hexit = mantissa >> mantissa_bits;
-       const int leading_hexit_width
-         = __bit_width((unsigned)leading_hexit); // FIXME: optimize?
+       const int leading_hexit_width = __bit_width(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'.

Reply via email to