aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2023-07-15 20:41:28 +0100
committerJonathan Wakely <jwakely@redhat.com>2023-07-19 11:03:31 +0100
commitf0b0c21152b337bc9a8ef3a72a15c8dcdff1d847 (patch)
treec5b41f6b3bad4b4826744777ec43466da74f879b
parent58303d42809f0e01f23262f592d37943f7703f71 (diff)
downloadgcc-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.h16
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