libstdc++: Fix aligned formatting of stacktrace_entry and thread::id [PR112564]
The formatter for std:🧵: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.
This commit is contained in:
parent
8ed7120eaa
commit
23725aa53b
4 changed files with 32 additions and 7 deletions
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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>> );
|
||||
|
|
Loading…
Add table
Reference in a new issue