public inbox for libstdc++-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-5536] libstdc++: Fix aligned formatting of stacktrace_entry and thread::id [PR112564]
@ 2023-11-16 17:20 Jonathan Wakely
  0 siblings, 0 replies; only message in thread
From: Jonathan Wakely @ 2023-11-16 17:20 UTC (permalink / raw)
  To: gcc-cvs, libstdc++-cvs

https://gcc.gnu.org/g:23725aa53bd264941c4fb228227736be4da59761

commit r14-5536-g23725aa53bd264941c4fb228227736be4da59761
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Nov 16 16:11:18 2023 +0000

    libstdc++: Fix aligned formatting of stacktrace_entry and thread::id [PR112564]
    
    The formatter for std::thread::id should default to right-align, and the
    formatter for std::stacktrace_entry should not just ignore the
    fill-and-align and width from the format-spec!
    
    libstdc++-v3/ChangeLog:
    
            PR libstdc++/112564
            * include/std/stacktrace (formatter::format): Format according
            to format-spec.
            * include/std/thread (formatter::format): Use _Align_right as
            default.
            * testsuite/19_diagnostics/stacktrace/output.cc: Check
            fill-and-align handling. Change compile test to run.
            * testsuite/30_threads/thread/id/output.cc: Check fill-and-align
            handling.

Diff:
---
 libstdc++-v3/include/std/stacktrace                    |  4 +++-
 libstdc++-v3/include/std/thread                        |  3 ++-
 .../testsuite/19_diagnostics/stacktrace/output.cc      | 18 +++++++++++++++---
 libstdc++-v3/testsuite/30_threads/thread/id/output.cc  | 14 ++++++++++++--
 4 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/libstdc++-v3/include/std/stacktrace b/libstdc++-v3/include/std/stacktrace
index 9d5f6396aed..f570745fe51 100644
--- a/libstdc++-v3/include/std/stacktrace
+++ b/libstdc++-v3/include/std/stacktrace
@@ -740,7 +740,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	{
 	  std::ostringstream __os;
 	  __os << __x;
-	  return __format::__write(__fc.out(), __os.view());
+	  auto __str = __os.view();
+	  return __format::__write_padded_as_spec(__str, __str.size(),
+						  __fc, _M_spec);
 	}
 
     private:
diff --git a/libstdc++-v3/include/std/thread b/libstdc++-v3/include/std/thread
index 39042d7cdf5..ee3b8b1fcb0 100644
--- a/libstdc++-v3/include/std/thread
+++ b/libstdc++-v3/include/std/thread
@@ -335,7 +335,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	  __os << __id;
 	  auto __str = __os.view();
 	  return __format::__write_padded_as_spec(__str, __str.size(),
-						  __fc, _M_spec);
+						  __fc, _M_spec,
+						  __format::_Align_right);
 	}
 
     private:
diff --git a/libstdc++-v3/testsuite/19_diagnostics/stacktrace/output.cc b/libstdc++-v3/testsuite/19_diagnostics/stacktrace/output.cc
index 4960ccb85b8..67f1e0cebaf 100644
--- a/libstdc++-v3/testsuite/19_diagnostics/stacktrace/output.cc
+++ b/libstdc++-v3/testsuite/19_diagnostics/stacktrace/output.cc
@@ -1,4 +1,5 @@
-// { dg-do compile { target c++23 } }
+// { dg-options "-lstdc++exp" }
+// { dg-do run { target c++23 } }
 // { dg-require-effective-target stacktrace }
 // { dg-add-options no_pch }
 
@@ -17,7 +18,8 @@ test_to_string()
 {
   auto trace = std::stacktrace::current();
   std::string s1 = std::to_string(trace.at(0));
-  VERIFY( s1.contains("test_to_string():15") );
+  VERIFY( s1.contains("test_to_string()") );
+  VERIFY( s1.contains("output.cc:19") );
   std::string s2 = std::to_string(trace);
   VERIFY( s2.contains(s1) );
 }
@@ -47,7 +49,17 @@ test_format()
   std::stacktrace_entry entry = trace.at(0);
   std::string str = std::to_string(entry);
   VERIFY( std::format("{}", entry) == str );
-  VERIFY( std::format("{0:!<{1}}", entry, str.size() + 3) == (str + "!!!") );
+  auto len = str.size();
+  // with width
+  VERIFY( std::format("{0:{1}}", entry, len + 1) == (str + " ") );
+  // with align + width
+  VERIFY( std::format("{0:<{1}}", entry, len + 2) == (str + "  ") );
+  VERIFY( std::format("{0:^{1}}", entry, len + 3) == (" " + str + "  ") );
+  VERIFY( std::format("{0:>{1}}", entry, len + 4) == ("    " + str) );
+  // with fill-and-align + width
+  VERIFY( std::format("{0:!<{1}}", entry, len + 2) == (str + "!!") );
+  VERIFY( std::format("{0:!^{1}}", entry, len + 3) == ("!" + str + "!!") );
+  VERIFY( std::format("{0:!>{1}}", entry, len + 4) == ("!!!!" + str) );
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/30_threads/thread/id/output.cc b/libstdc++-v3/testsuite/30_threads/thread/id/output.cc
index 08d8c899fda..3c167202b02 100644
--- a/libstdc++-v3/testsuite/30_threads/thread/id/output.cc
+++ b/libstdc++-v3/testsuite/30_threads/thread/id/output.cc
@@ -80,8 +80,18 @@ test02()
   auto len = s1.size();
   out.str("");
 
-  auto s2 = std::format("{0:x^{1}}", j, len + 4);
-  VERIFY( s2 == ("xx" + s1 + "xx") );
+  std::string s2;
+  // with width
+  s2 = std::format("{0:{1}}", j, len + 2);
+  VERIFY( s2 == ("  " + s1) );
+  // with align + width
+  s2 = std::format("{0:>{1}}", j, len + 2);
+  VERIFY( s2 == ("  " + s1) );
+  s2 = std::format("{0:<{1}}", j, len + 2);
+  VERIFY( s2 == (s1 + "  ") );
+  // with fill-and-align + width
+  s2 = std::format("{0:x^{1}}", j, len + 5);
+  VERIFY( s2 == ("xx" + s1 + "xxx") );
 
 #ifdef _GLIBCXX_USE_WCHAR_T
   static_assert( std::is_default_constructible_v<std::formatter<std::thread::id, wchar_t>> );

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-11-16 17:20 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-16 17:20 [gcc r14-5536] libstdc++: Fix aligned formatting of stacktrace_entry and thread::id [PR112564] Jonathan Wakely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).