https://gcc.gnu.org/g:0cdd4c97c40331eadbd3e0e08c3c6f122c765c87
commit r14-11188-g0cdd4c97c40331eadbd3e0e08c3c6f122c765c87 Author: Jonathan Wakely <jwak...@redhat.com> Date: Wed Dec 11 09:37:48 2024 +0000 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. (cherry picked from commit 1fd7e36e990396c22823cedd068def2aa3b112ce) Diff: --- libstdc++-v3/include/std/ostream | 6 ++++-- libstdc++-v3/testsuite/27_io/basic_ostream/print/1.cc | 18 +++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/libstdc++-v3/include/std/ostream b/libstdc++-v3/include/std/ostream index 12be6c4fd178..cb5675fe1bda 100644 --- a/libstdc++-v3/include/std/ostream +++ b/libstdc++-v3/include/std/ostream @@ -992,8 +992,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. diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/print/1.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/print/1.cc index cd4b116ac1c0..183e08733d23 100644 --- a/libstdc++-v3/testsuite/27_io/basic_ostream/print/1.cc +++ b/libstdc++-v3/testsuite/27_io/basic_ostream/print/1.cc @@ -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