[PATCH 2/2] libstdc++: Always treat __float128 as a floating-point type
Patrick Palka
ppalka@redhat.com
Fri Jul 11 01:04:57 GMT 2025
On Wed, 9 Jul 2025, Jonathan Wakely wrote:
> Similar to the previous commit that made is_integral_v<__int128>
> unconditionally true, this makes is_floating_point_v<__float128>
> unconditionally true. With the new extended floating-point types in
> C++23 (std::float64_t etc.) it seems unhelpful for is_floating_point_v
> to be true for them, but not for __float128. Especially as it is true on
> some targets, because __float128 is just a typedef for long double.
>
> This change makes is_floating_point_v<__float128> true whenever the type
> is defined, giving less surprising and more portable behaviour.
LGTM
>
> libstdc++-v3/ChangeLog:
>
> * include/bits/cpp_type_traits.h (__is_floating<__float128>):
> Do not depend on __STRICT_ANSI__.
> * include/bits/stl_algobase.h (__size_to_integer(__float128)):
> Likewise.
> * include/std/type_traits (__is_floating_point_helper<__float128>):
> Likewise.
> ---
>
> Tested x86_64-linux and powerpc64le-linux.
>
> I don't _think_ this affects how <format> handles __float128, because
> there are std::formatter specializations for each floating-point type,
> rather than a partial specialization that uses std::floating_point.
>
> libstdc++-v3/include/bits/cpp_type_traits.h | 9 +++++++++
> libstdc++-v3/include/bits/stl_algobase.h | 2 +-
> libstdc++-v3/include/std/type_traits | 2 +-
> 3 files changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/libstdc++-v3/include/bits/cpp_type_traits.h b/libstdc++-v3/include/bits/cpp_type_traits.h
> index 770ad94b3b4d..38cea4c67b76 100644
> --- a/libstdc++-v3/include/bits/cpp_type_traits.h
> +++ b/libstdc++-v3/include/bits/cpp_type_traits.h
> @@ -313,6 +313,15 @@ __INT_N(__int128)
> typedef __true_type __type;
> };
>
> +#ifdef _GLIBCXX_USE_FLOAT128
> + template<>
> + struct __is_floating<__float128>
> + {
> + enum { __value = 1 };
> + typedef __true_type __type;
> + };
> +#endif
> +
> #ifdef __STDCPP_FLOAT16_T__
> template<>
> struct __is_floating<_Float16>
> diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h
> index 71ef2335a311..b104ec2536a0 100644
> --- a/libstdc++-v3/include/bits/stl_algobase.h
> +++ b/libstdc++-v3/include/bits/stl_algobase.h
> @@ -1065,7 +1065,7 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
> __size_to_integer(double __n) { return (long long)__n; }
> inline _GLIBCXX_CONSTEXPR long long
> __size_to_integer(long double __n) { return (long long)__n; }
> -#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
> +#ifdef _GLIBCXX_USE_FLOAT128
> __extension__ inline _GLIBCXX_CONSTEXPR long long
> __size_to_integer(__float128 __n) { return (long long)__n; }
> #endif
> diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
> index e88d04e44d76..78a5ee8c0eb4 100644
> --- a/libstdc++-v3/include/std/type_traits
> +++ b/libstdc++-v3/include/std/type_traits
> @@ -532,7 +532,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> : public true_type { };
> #endif
>
> -#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
> +#ifdef _GLIBCXX_USE_FLOAT128
> template<>
> struct __is_floating_point_helper<__float128>
> : public true_type { };
> --
> 2.50.0
>
>
More information about the Libstdc++
mailing list