mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-28 22:34:03 +08:00
libstdc++: Check FE_TONEAREST is defined before using it
We need to test that FE_TONEAREST is defined before we may use it along with fegetround/fesetround to adjust the floating-point rounding mode. This fixes a build failure with older versions of newlib. libstdc++-v3/ChangeLog: * src/c++17/floating_from_chars.cc (from_chars_impl) [!defined(FE_TONEAREST)]: Don't adjust the rounding mode. * src/c++17/floating_to_chars.cc (__floating_to_chars_precision): Likewise.
This commit is contained in:
parent
3af02d32cc
commit
266d746475
@ -307,7 +307,7 @@ namespace
|
||||
{
|
||||
locale_t orig = ::uselocale(loc);
|
||||
|
||||
#if _GLIBCXX_USE_C99_FENV_TR1
|
||||
#if _GLIBCXX_USE_C99_FENV_TR1 && defined(FE_TONEAREST)
|
||||
const int rounding = std::fegetround();
|
||||
if (rounding != FE_TONEAREST)
|
||||
std::fesetround(FE_TONEAREST);
|
||||
@ -333,7 +333,7 @@ namespace
|
||||
#endif
|
||||
const int conv_errno = std::__exchange(errno, save_errno);
|
||||
|
||||
#if _GLIBCXX_USE_C99_FENV_TR1
|
||||
#if _GLIBCXX_USE_C99_FENV_TR1 && defined(FE_TONEAREST)
|
||||
if (rounding != FE_TONEAREST)
|
||||
std::fesetround(rounding);
|
||||
#endif
|
||||
|
@ -946,13 +946,13 @@ template<typename T>
|
||||
// digit, and carefully compute and write the last digit
|
||||
// ourselves.
|
||||
char buffer[expected_output_length+1];
|
||||
#if _GLIBCXX_USE_C99_FENV_TR1
|
||||
#if _GLIBCXX_USE_C99_FENV_TR1 && defined(FE_TONEAREST)
|
||||
const int saved_rounding_mode = fegetround();
|
||||
if (saved_rounding_mode != FE_TONEAREST)
|
||||
fesetround(FE_TONEAREST); // We want round-to-nearest behavior.
|
||||
#endif
|
||||
const int output_length = sprintf(buffer, "%.0Lf", value);
|
||||
#if _GLIBCXX_USE_C99_FENV_TR1
|
||||
#if _GLIBCXX_USE_C99_FENV_TR1 && defined(FE_TONEAREST)
|
||||
if (saved_rounding_mode != FE_TONEAREST)
|
||||
fesetround(saved_rounding_mode);
|
||||
#endif
|
||||
@ -1139,14 +1139,14 @@ template<typename T>
|
||||
|
||||
// Do the sprintf into the local buffer.
|
||||
char buffer[output_length_upper_bound+1];
|
||||
#if _GLIBCXX_USE_C99_FENV_TR1
|
||||
#if _GLIBCXX_USE_C99_FENV_TR1 && defined(FE_TONEAREST)
|
||||
const int saved_rounding_mode = fegetround();
|
||||
if (saved_rounding_mode != FE_TONEAREST)
|
||||
fesetround(FE_TONEAREST); // We want round-to-nearest behavior.
|
||||
#endif
|
||||
int output_length
|
||||
= sprintf(buffer, output_specifier, effective_precision, value);
|
||||
#if _GLIBCXX_USE_C99_FENV_TR1
|
||||
#if _GLIBCXX_USE_C99_FENV_TR1 && defined(FE_TONEAREST)
|
||||
if (saved_rounding_mode != FE_TONEAREST)
|
||||
fesetround(saved_rounding_mode);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user