libstdc++: Do not apply localized formatting to NaN and inf [PR114863]

We don't want to add grouping to strings like "-inf", and there is no
radix character to replace either.

libstdc++-v3/ChangeLog:

	PR libstdc++/114863
	* include/std/format (__formatter_fp::format): Only use
	_M_localized for finite values.
	* testsuite/std/format/functions/format.cc: Check localized
	formatting of NaN and initiny.
This commit is contained in:
Jonathan Wakely
2024-04-26 11:42:26 +01:00
parent 7d5479a2ec
commit a0bc71e480
2 changed files with 9 additions and 1 deletions

View File

@@ -1734,7 +1734,7 @@ namespace __format
}
#endif
if (_M_spec._M_localized)
if (_M_spec._M_localized && __builtin_isfinite(__v))
{
__wstr = _M_localize(__str, __expc, __fc.locale());
if (!__wstr.empty())

View File

@@ -248,6 +248,14 @@ test_locale()
s = std::format(cloc, "{:05L}", -1.0); // PR libstdc++/110968
VERIFY( s == "-0001" );
// PR libstdc++/114863 grouping applied to nan and inf
double inf = std::numeric_limits<double>::infinity();
s = std::format(eloc, "{0:Le} {0:Lf} {0:Lg}", -inf);
VERIFY( s == "-inf -inf -inf" );
double nan = std::numeric_limits<double>::quiet_NaN();
s = std::format(eloc, "{0:Le} {0:Lf} {0:Lg}", -nan);
VERIFY( s == "-nan -nan -nan" );
// Restore
std::locale::global(cloc);
}