diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2023-07-19 21:15:17 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2023-07-19 23:42:56 +0100 |
commit | 0867d30a68de68f4c809757348447bef94ef1491 (patch) | |
tree | 67d41954794db0a19652fe92abb4546f4368d87c /libstdc++-v3 | |
parent | 2d614822e9ea2a3d8800045d66e3220743753d09 (diff) | |
download | gcc-0867d30a68de68f4c809757348447bef94ef1491.zip gcc-0867d30a68de68f4c809757348447bef94ef1491.tar.gz gcc-0867d30a68de68f4c809757348447bef94ef1491.tar.bz2 |
libstdc++: Do not define inaccurate from_chars for _Float128 [PR110077]
I think r14-1431-g7037e7b6e4ac41 was wrong to try to define the
_Float128 overload unconditionally. Not all targets need it, so defining
the lossy fallback using long double is not useful (and caused an ABI
change on Solaris x86).
Making the definition depend on USE_STRTOF128_FOR_FROM_CHARS again
partially reverts the change for PR 109921, however that should still be
fixed because the changes to make USE_STRTOF128_FOR_FROM_CHARS depend on
USE_STRTOD_FOR_FROM_CHARS are not reverted.
libstdc++-v3/ChangeLog:
PR libstdc++/110077
* src/c++17/floating_from_chars.cc (from_chars): Only define
_Float128 overload when using __strfromf128.
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/src/c++17/floating_from_chars.cc | 12 |
1 files changed, 1 insertions, 11 deletions
diff --git a/libstdc++-v3/src/c++17/floating_from_chars.cc b/libstdc++-v3/src/c++17/floating_from_chars.cc index 3152d64..e421c5a 100644 --- a/libstdc++-v3/src/c++17/floating_from_chars.cc +++ b/libstdc++-v3/src/c++17/floating_from_chars.cc @@ -1325,24 +1325,14 @@ _ZSt10from_charsPKcS0_RDF128_St12chars_format(const char* first, __ieee128& value, chars_format fmt) noexcept __attribute__((alias ("_ZSt10from_charsPKcS0_Ru9__ieee128St12chars_format"))); -#elif __FLT128_MANT_DIG__ == 113 && __LDBL_MANT_DIG__ != 113 +#elif defined(USE_STRTOF128_FOR_FROM_CHARS) // Overload for _Float128 is not defined inline in <charconv>, define it here. from_chars_result from_chars(const char* first, const char* last, _Float128& value, chars_format fmt) noexcept { -#ifdef USE_STRTOF128_FOR_FROM_CHARS // fast_float doesn't support IEEE binary128 format, but we can use strtold. return from_chars_strtod(first, last, value, fmt); -#else - // Read a long double. This might give an incorrect result (e.g. values - // out of range of long double give an error, even if they fit in _Float128). - long double ldbl_val; - auto res = std::from_chars(first, last, ldbl_val, fmt); - if (res.ec == errc{}) - value = ldbl_val; - return res; -#endif } #endif |