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:
Patrick Palka 2020-12-18 11:52:14 -05:00
parent 3af02d32cc
commit 266d746475
2 changed files with 6 additions and 6 deletions

View File

@ -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

View File

@ -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