diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2023-07-15 20:41:28 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2023-07-19 11:03:31 +0100 |
commit | f0b0c21152b337bc9a8ef3a72a15c8dcdff1d847 (patch) | |
tree | c5b41f6b3bad4b4826744777ec43466da74f879b | |
parent | 58303d42809f0e01f23262f592d37943f7703f71 (diff) | |
download | gcc-f0b0c21152b337bc9a8ef3a72a15c8dcdff1d847.zip gcc-f0b0c21152b337bc9a8ef3a72a15c8dcdff1d847.tar.gz gcc-f0b0c21152b337bc9a8ef3a72a15c8dcdff1d847.tar.bz2 |
libstdc++: Define std::stof fallback in terms of std::stod [PR110653]
For targets without std::strtof we can define std::stof by calling
std::stod and then checking if the result is out of range of float.
libstdc++-v3/ChangeLog:
PR libstdc++/110653
* include/bits/basic_string.h [!_GLIBCXX_HAVE_STRTOF] (stof):
Define in terms of std::stod.
-rw-r--r-- | libstdc++-v3/include/bits/basic_string.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index 32f5d44..e4cb984 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -4153,6 +4153,22 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 inline float stof(const string& __str, size_t* __idx = 0) { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); } +#else + inline float + stof(const string& __str, size_t* __idx = 0) + { + double __d = std::stod(__str, __idx); + if (__builtin_isfinite(__d)) + { + double __abs_d = __builtin_fabs(__d); + if (__abs_d < __FLT_MIN__ || __abs_d > __FLT_MAX__) + { + errno = ERANGE; + std::__throw_out_of_range("stof"); + } + } + return __d; + } #endif #if _GLIBCXX_USE_C99_STDLIB || _GLIBCXX_HAVE_STRTOLD |