An updated version of patch, that takes a safer approach on not declaring a special formatter for __float128 if its long double is possibly IEEE 128. Please let me know if that version addressed the problem on sparc. I thinking there are more sparc machines in compiler farm, so I am going to check that tomorrow.
diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format index b1823db83bc..d2ac84a1709 100644 --- a/libstdc++-v3/include/std/format +++ b/libstdc++-v3/include/std/format @@ -2973,11 +2973,10 @@ namespace __format }; #endif -#if defined(__SIZEOF_FLOAT128__) && _GLIBCXX_FORMAT_F128 > 1 +#if defined(__SIZEOF_FLOAT128__) && _GLIBCXX_FORMAT_F128 == 2 // Reuse __formatter_fp<C>::format<__format::__flt128_t, Out> for __float128. - // This formatter is not declared if _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT is true, - // as __float128 when present is same type as __ieee128, which may be same as - // long double. + // This formatter is only declared when __flt128_t is _Float128, as in other + // cases __float128 may be same type as long double (powerpc and sparc). template<__format::__char _CharT> struct formatter<__float128, _CharT> { @@ -2995,9 +2994,6 @@ namespace __format private: __format::__formatter_fp<_CharT> _M_f; - - static_assert( !is_same_v<__float128, long double>, - "This specialization should not be used for long double" ); }; #endif -- 2.49.0 On Thu, May 15, 2025 at 9:20 PM Tomasz Kaminski <tkami...@redhat.com> wrote: > Hi, > > I apologize for the chrum that this patch created. I have added this > static assert to detect environments where __float128 is same as long > double. > From original commit message: > >We also provide formatter<__float128, _CharT> that formats via __flt128_t. > >As this type may be disabled (-mno-float128), extra care needs to be > taken, > >for situation when __float128 is same as long double. If the formatter > would be > >defined in such case, the formatter<long double, _CharT> would be > generated > >from different specializations, and have different mangling: > > * formatter<__float128, _CharT> if __float128 is present, > > * formatter<__format::__formattable_float, _CharT> otherwise. > >To best of my knowledge this happens only on ppc64 for __ieee128 and > __float128, > >so the formatter is not defined in this case. static_assert is added to > detect > >other configurations like that. In such case we should replace it with > constra > > I do not have access to a machine with that setup to confirm, > but could you please check if the following patch fixes this. > --- > libstdc++-v3/include/std/format | 4 +--- > 1 file changed, 1 insertion(+), 3 deletions(-) > > diff --git a/libstdc++-v3/include/std/format > b/libstdc++-v3/include/std/format > index b1823db83bc..a870aa3f3ea 100644 > --- a/libstdc++-v3/include/std/format > +++ b/libstdc++-v3/include/std/format > @@ -2979,6 +2979,7 @@ namespace __format > // as __float128 when present is same type as __ieee128, which may be > same as > // long double. > template<__format::__char _CharT> > + requires (!is_same_v<__float128, long double>) > struct formatter<__float128, _CharT> > { > formatter() = default; > @@ -2995,9 +2996,6 @@ namespace __format > > private: > __format::__formatter_fp<_CharT> _M_f; > - > - static_assert( !is_same_v<__float128, long double>, > - "This specialization should not be used for long > double" ); > }; > #endif > > -- > 2.49.0 > > > > On Thu, May 15, 2025 at 7:46 PM Rainer Orth <r...@cebitec.uni-bielefeld.de> > wrote: > >> Hi Jonathan, >> >> > On Thu, 15 May 2025 at 15:02, Rainer Orth <r...@cebitec.uni-bielefeld.de> >> wrote: >> >> >> >> Hi Jonathan, >> >> >> >> >> > this patch broke Solaris bootstrap, both i386-pc-solaris2.11 and >> >> >> > sparc-sun-solaris2.11: >> >> >> > >> >> >> > In file included from >> >> >> > /vol/gcc/src/hg/master/local/libstdc++-v3/src/c++20/format.cc:29: >> >> >> > >> /var/gcc/regression/master/11.4-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/format: >> >> >> > In member function ‘typename std::basic_format_context<_Out, >> >> >> > _CharT>::iterator std::formatter<__float128, >> >> >> > _CharT>::format(__float128, std::basic_format_context<_Out, >> _CharT>&) >> >> >> > const’: >> >> >> > >> /var/gcc/regression/master/11.4-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/format:2994:41: >> >> >> > error: ‘__flt128_t’ is not a member of ‘std::__format’; did you >> mean >> >> >> > ‘__bflt16_t’? [-Wtemplate-body] >> >> >> > 2994 | { return _M_f.format((__format::__flt128_t)__u, >> __fc); } >> >> >> > | ^~~~~~~~~~ >> >> >> > | __bflt16_t >> >> >> > >> >> >> > and one more instance. >> >> >> >> >> >> And on x86_64-darwin too. >> >> > >> >> > Tomasz, should this be: >> >> > >> >> > --- a/libstdc++-v3/include/std/format >> >> > +++ b/libstdc++-v3/include/std/format >> >> > @@ -2973,7 +2973,7 @@ namespace __format >> >> > }; >> >> > #endif >> >> > >> >> > -#if defined(__SIZEOF_FLOAT128__) && _GLIBCXX_FORMAT_F128 != 1 >> >> > +#if defined(__SIZEOF_FLOAT128__) && _GLIBCXX_FORMAT_F128 > 1 >> >> > // Reuse __formatter_fp<C>::format<__format::__flt128_t, Out> for >> __float128. >> >> > // This formatter is not declared if >> >> > _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT is true, >> >> > // as __float128 when present is same type as __ieee128, which may >> be same as >> >> > >> >> >> >> with this patch applied, I could link libstdc++.so. I'll run a full >> >> bootstrap later today. >> > >> > >> > Good to know, thanks. Tomasz already pushed that change as >> > r16-647-gd010a39b9e788a >> > so trunk should be OK now. >> >> it is on Solaris/i386, but sparc is broken in a different way now: >> >> /var/gcc/regression/master/11.4-gcc/build/sparc-sun-solaris2.11/libstdc++-v3/include/format:2999:23: >> error: static assertion failed: This specialization should not be used for >> long double >> 2999 | static_assert( !is_same_v<__float128, long double>, >> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> /var/gcc/regression/master/11.4-gcc/build/sparc-sun-solaris2.11/libstdc++-v3/include/format:2999:23: >> note: ‘!(bool)std::is_same_v<long double, long double>’ evaluates to false >> /var/gcc/regression/master/11.4-gcc/build/sparc-sun-solaris2.11/libstdc++-v3/include/format: >> In instantiation of ‘struct std::formatter<long double, char>’: >> /var/gcc/regression/master/11.4-gcc/build/sparc-sun-solaris2.11/libstdc++-v3/include/type_traits:3559:54: >> required from ‘constexpr const bool >> std::is_default_constructible_v<std::formatter<long double, char> >’ >> 3559 | inline constexpr bool is_default_constructible_v = >> __is_constructible(_Tp); >> | >> ^~~~~~~~~~~~~~~~~~~~~~~ >> [...] >> >> I've a local patch in tree to support __float128 on SPARC, so I'll try >> with an unmodified tree first. However, 2 days ago I could bootstrap >> with that included just fine. >> >> Rainer >> >> -- >> >> ----------------------------------------------------------------------------- >> Rainer Orth, Center for Biotechnology, Bielefeld University >> >>