| // { dg-do run { target c++26 } } |
| |
| #include <format> |
| #include <testsuite_hooks.h> |
| |
| void |
| test_char() |
| { |
| std::string fmt = "{}"; |
| auto s = std::format(std::runtime_format(fmt), 123); |
| VERIFY( s == "123" ); |
| } |
| |
| void |
| test_wchar() |
| { |
| std::wstring fmt = L"{:#o}"; |
| auto s = std::format(std::runtime_format(fmt), 456); |
| VERIFY( s == L"0710" ); |
| } |
| |
| void |
| test_internal_api() |
| { |
| // Using _Runtime_format_string directly works even in C++20 mode. |
| // This can be used internally by libstdc++. |
| std::string fmt = "{:#x}"; |
| auto s = std::format(std::__format::_Runtime_format_string<char>(fmt), 789); |
| VERIFY( s == "0x315" ); |
| } |
| |
| static_assert( noexcept(std::format_string<>(std::runtime_format(""))) ); |
| static_assert( noexcept(std::wformat_string<>(std::runtime_format(L""))) ); |
| static_assert( noexcept(std::format_string<int>(std::runtime_format(""))) ); |
| static_assert( noexcept(std::wformat_string<char>(std::runtime_format(L""))) ); |
| // A format string can be constructed from the result of std::runtime_format |
| // using copy elision, but cannot be constructed from an xvalue. |
| static_assert( !std::is_constructible_v<std::format_string<>, |
| decltype(std::runtime_format(""))&&> ); |
| static_assert( !std::is_constructible_v<std::wformat_string<>, |
| decltype(std::runtime_format(L""))&&> ); |
| |
| int main() |
| { |
| test_char(); |
| test_wchar(); |
| test_internal_api(); |
| } |