From 1fd7e36e990396c22823cedd068def2aa3b112ce Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 11 Dec 2024 09:37:48 +0000 Subject: [PATCH] libstdc++: Make std::println use locale from ostream (LWG 4088) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- libstdc++-v3/include/std/ostream | 6 ++++-- .../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 637aad5a5a4..327313a881d 100644 --- a/libstdc++-v3/include/std/ostream +++ b/libstdc++-v3/include/std/ostream @@ -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. 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 cd4b116ac1c..183e08733d2 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 -{ - 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