libstdc++: Make std::println use locale from ostream (LWG 4088)

This was just approved in Wrocław.

libstdc++-v3/ChangeLog:

	* include/std/ostream (println): Pass stream's locale to
	std::format, as per LWG 4088.
	* testsuite/27_io/basic_ostream/print/1.cc: Check std::println
	with custom locale. Remove unused brit_punc class.
This commit is contained in:
Jonathan Wakely 2024-12-11 09:37:48 +00:00 committed by Jonathan Wakely
parent e76df35864
commit 1fd7e36e99
No known key found for this signature in database
2 changed files with 13 additions and 11 deletions

View file

@ -1028,8 +1028,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
inline void
println(ostream& __os, format_string<_Args...> __fmt, _Args&&... __args)
{
std::print(__os, "{}\n",
std::format(__fmt, std::forward<_Args>(__args)...));
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 4088. println ignores the locale imbued in std::ostream
std::print(__os, "{}\n", std::format(__os.getloc(), __fmt,
std::forward<_Args>(__args)...));
}
// Defined for C++26, supported as an extension to C++23.

View file

@ -63,14 +63,6 @@ test_vprint_nonunicode()
// { dg-output "garbage in . garbage out" }
}
struct brit_punc : std::numpunct<char>
{
std::string do_grouping() const override { return "\3\3"; }
char do_thousands_sep() const override { return ','; }
std::string do_truename() const override { return "yes mate"; }
std::string do_falsename() const override { return "nah bruv"; }
};
void
test_locale()
{
@ -82,7 +74,7 @@ test_locale()
// The default C locale.
std::locale cloc = std::locale::classic();
// A custom locale using comma digit separators.
// A custom locale using tilde digit separators.
std::locale bloc(cloc, new stream_punc);
{
@ -101,6 +93,14 @@ test_locale()
std::print(os, "{:L} {}", 12345, 6789);
VERIFY(os.str() == "1~23~45 6789");
}
{
// LWG 4088. println ignores the locale imbued in std::ostream
std::ostringstream os;
os.imbue(bloc);
std::println(os, "{:L} {}", 12345, 6789);
VERIFY(os.str() == "1~23~45 6789\n");
}
}
void