blob: ea9da7fa248675e1b4f3e37f2f78462df68f36da [file] [log] [blame]
// { dg-options "-funwind-tables -lstdc++exp" }
// { dg-do run { target c++23 } }
// { dg-require-cpp-feature-test __cpp_lib_stacktrace }
// { dg-add-options no_pch }
#include <stacktrace>
#include <sstream>
#include <testsuite_hooks.h>
#ifndef __cpp_lib_formatters
# error "Feature-test macro for formatters missing in <stacktrace>"
#elif __cpp_lib_formatters < 202302L
# error "Feature-test macro for formatters has wrong value in <stacktrace>"
#endif
void
test_to_string()
{
auto trace = std::stacktrace::current();
std::string s1 = std::to_string(trace.at(0));
VERIFY( s1.contains("test_to_string()") );
VERIFY( s1.contains("output.cc:19") );
std::string s2 = std::to_string(trace);
VERIFY( s2.contains(s1) );
}
void
test_ostream()
{
std::ostringstream out;
auto trace = std::stacktrace::current();
out << trace.at(0);
VERIFY( out.str() == std::to_string(trace.at(0)) );
out.str("");
out << trace;
VERIFY( out.str() == std::to_string(trace) );
}
void
test_format()
{
static_assert( std::is_default_constructible_v<std::formatter<std::stacktrace_entry, char>> );
static_assert( std::is_default_constructible_v<std::formatter<std::stacktrace, char>> );
static_assert( std::is_default_constructible_v<std::formatter<std::pmr::stacktrace, char>> );
auto trace = std::pmr::stacktrace::current();
VERIFY( std::format("{}", trace) == std::to_string(trace) );
std::stacktrace_entry entry = trace.at(0);
std::string str = std::to_string(entry);
VERIFY( std::format("{}", entry) == 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()
{
test_to_string();
test_ostream();
test_format();
}