On Thu, 17 Apr 2025 at 07:06, Tomasz Kaminski <tkami...@redhat.com> wrote: > > > > On Wed, Mar 12, 2025 at 1:00 PM Jonathan Wakely <jwak...@redhat.com> wrote: >> >> On Tue, 11 Mar 2025 at 12:22, Tomasz Kamiński wrote: >> > >> > Floating points types _Float16, _Float32, _Float64, and bfloat16, >> > can be formatted only if std::to_chars overloads for such types >> > where provided. Currently this is only the case for architectures >> >> Spelling: "were provided" >> >> With that fixed, OK for trunk, thanks for noticing this. >> >> I think we also want this on the gcc-14 and gcc-13 branches, but after >> it's sat on trunk for a while. > > OK to backport to both now?
Yes, OK for 13 and 14, thanks. >> >> >> > where float and double are 32-bits and 64-bits IEEE floating points types. >> > >> > This patch updates the preprocessing checks for formatters >> > for above types to check _GLIBCXX_FLOAT_IS_IEEE_BINARY32 >> > and _GLIBCXX_DOUBLE_IS_IEEE_BINARY64. Making them non-formattable >> > on non-IEEE architectures. >> > >> > Remove a potential UB, where we could produce basic_format_arg >> > with _M_type set to _Arg_fp32 or _Arg_fp64, that was later not >> > handled by `_M_visit`. >> > >> > libstdc++-v3/ChangeLog: >> > >> > * include/std/format (formatter<_Float16, _CharT>): Define only if >> > _GLIBCXX_FLOAT_IS_IEEE_BINARY32 macro is defined. >> > (formatter<_Float16, _CharT>): As above. >> > (formatter<__gnu_cxx::__bfloat16_t, _CharT>): As above. >> > (formatter<_Float64, _CharT>): Define only if >> > _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 is defined. >> > (basic_format_arg::_S_to_arg_type): Normalize _Float32 and _Float64 >> > only to float and double respectivelly. >> > (basic_format_arg::_S_to_enum): Remove handling of _Float32 and >> > _Float64. >> > --- >> > Tested on x86_64-linux. OK for trunk? >> > >> > libstdc++-v3/include/std/format | 32 ++++++++------------------------ >> > 1 file changed, 8 insertions(+), 24 deletions(-) >> > >> > diff --git a/libstdc++-v3/include/std/format >> > b/libstdc++-v3/include/std/format >> > index e7e0d2d142b..1809f040077 100644 >> > --- a/libstdc++-v3/include/std/format >> > +++ b/libstdc++-v3/include/std/format >> > @@ -2276,7 +2276,7 @@ namespace __format >> > }; >> > #endif >> > >> > -#ifdef __STDCPP_FLOAT16_T__ >> > +#if defined(__STDCPP_FLOAT16_T__) && >> > defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) >> > // Reuse __formatter_fp<C>::format<float, Out> for _Float16. >> > template<__format::__char _CharT> >> > struct formatter<_Float16, _CharT> >> > @@ -2298,7 +2298,7 @@ namespace __format >> > }; >> > #endif >> > >> > -#if defined(__FLT32_DIG__) >> > +#if defined(__FLT32_DIG__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) >> > // Reuse __formatter_fp<C>::format<float, Out> for _Float32. >> > template<__format::__char _CharT> >> > struct formatter<_Float32, _CharT> >> > @@ -2320,7 +2320,7 @@ namespace __format >> > }; >> > #endif >> > >> > -#if defined(__FLT64_DIG__) >> > +#if defined(__FLT64_DIG__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64) >> > // Reuse __formatter_fp<C>::format<double, Out> for _Float64. >> > template<__format::__char _CharT> >> > struct formatter<_Float64, _CharT> >> > @@ -2364,7 +2364,7 @@ namespace __format >> > }; >> > #endif >> > >> > -#ifdef __STDCPP_BFLOAT16_T__ >> > +#if defined(__STDCPP_BFLOAT16_T__) && >> > defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) >> > // Reuse __formatter_fp<C>::format<float, Out> for bfloat16_t. >> > template<__format::__char _CharT> >> > struct formatter<__gnu_cxx::__bfloat16_t, _CharT> >> > @@ -3443,22 +3443,16 @@ namespace __format >> > return type_identity<float>(); >> > #endif >> > >> > -#ifdef __FLT32_DIG__ >> > +#if defined(__FLT32_DIG__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32) >> > else if constexpr (is_same_v<_Td, _Float32>) >> > -# ifdef _GLIBCXX_FLOAT_IS_IEEE_BINARY32 >> > return type_identity<float>(); >> > -# else >> > - return type_identity<_Float32>(); >> > -# endif >> > #endif >> > -#ifdef __FLT64_DIG__ >> > + >> > +#if defined(__FLT64_DIG__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64) >> > else if constexpr (is_same_v<_Td, _Float64>) >> > -# ifdef _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 >> > return type_identity<double>(); >> > -# else >> > - return type_identity<_Float64>(); >> > -# endif >> > #endif >> > + >> > #if _GLIBCXX_FORMAT_F128 >> > # if __FLT128_DIG__ >> > else if constexpr (is_same_v<_Td, _Float128>) >> > @@ -3538,16 +3532,6 @@ namespace __format >> > return _Arg_u128; >> > #endif >> > >> > - // N.B. some of these types will never actually be used here, >> > - // because they get normalized to a standard floating-point type. >> > -#if defined __FLT32_DIG__ && ! _GLIBCXX_FLOAT_IS_IEEE_BINARY32 >> > - else if constexpr (is_same_v<_Tp, _Float32>) >> > - return _Arg_f32; >> > -#endif >> > -#if defined __FLT64_DIG__ && ! _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 >> > - else if constexpr (is_same_v<_Tp, _Float64>) >> > - return _Arg_f64; >> > -#endif >> > #if _GLIBCXX_FORMAT_F128 == 2 >> > else if constexpr (is_same_v<_Tp, __format::__float128_t>) >> > return _Arg_f128; >> > -- >> > 2.48.1 >> > >>