https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118879

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2025-02-14

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
The libstdc++ std::in_range does:

  template<typename _Res, typename _Tp>
    constexpr bool
    in_range(_Tp __t) noexcept
    {
      static_assert(__is_standard_integer<_Res>::value);
      static_assert(__is_standard_integer<_Tp>::value);
      using __gnu_cxx::__int_traits;

      if constexpr (is_signed_v<_Tp> == is_signed_v<_Res>)
        return __int_traits<_Res>::__min <= __t
          && __t <= __int_traits<_Res>::__max;
      else if constexpr (is_signed_v<_Tp>)
        return __t >= 0
          && make_unsigned_t<_Tp>(__t) <= __int_traits<_Res>::__max;
      else
        return __t <= make_unsigned_t<_Res>(__int_traits<_Res>::__max);
    }


In C++17 the result of int(v) was impl-defined, but since C++20 it's
well-defined, and std::in_range was only added in C++20. So we could change the
first branch to just return __t == _Ret(__t).

Reply via email to