]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Format __float128 as _Float128 only when long double is not 128 IEEE ...
authorTomasz Kamiński <tkaminsk@redhat.com>
Fri, 16 May 2025 05:12:36 +0000 (07:12 +0200)
committerTomasz Kamiński <tkaminsk@redhat.com>
Mon, 7 Jul 2025 11:32:21 +0000 (13:32 +0200)
For powerpc64 and sparc architectures that both have __float128 and 128bit long double,
the __float128 is same type as long double/__ieee128 and already formattable.

The remaining specialization makes __float128 formattable on x86_64 via _Float128,
however __float128 is now not formattable on x86_32 (-m32) with -mlong-double-128,
where __float128 is distinct type from long double that is 128bit IEEE.

PR libstdc++/120976

libstdc++-v3/ChangeLog:

* include/std/format (formatter<__float128, _Char_T): Define if
_GLIBCXX_FORMAT_F128 == 2.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
libstdc++-v3/include/std/format

index 46bd5d5ee6a0e72520776ea21610e84ef5c6aca9..5749aa1995a9bad2d405af3b40c44e005f9a7b51 100644 (file)
@@ -2998,11 +2998,9 @@ namespace __format
     };
 #endif
 
-#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
-  // long double.
+#if defined(__SIZEOF_FLOAT128__) && _GLIBCXX_FORMAT_F128 == 2
+  // Use __formatter_fp<C>::format<__format::__flt128_t, Out> for __float128,
+  // when long double is not 128bit IEEE type.
   template<__format::__char _CharT>
     struct formatter<__float128, _CharT>
     {
@@ -3020,9 +3018,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