]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Make std::println use locale from ostream (LWG 4088)
authorJonathan Wakely <jwakely@redhat.com>
Wed, 11 Dec 2024 09:37:48 +0000 (09:37 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 11 Dec 2024 10:52:09 +0000 (10:52 +0000)
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
libstdc++-v3/testsuite/27_io/basic_ostream/print/1.cc

index 637aad5a5a41bfe4a19c7c415d140bffd4b67d19..327313a881d456dcb16378914ea98640fd8cfbfb 100644 (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.
index cd4b116ac1c0c08ae55794ec7d5b009945eb21d5..183e08733d23c172858e80abefed166f7d19f073 100644 (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