1*13249036SMark de Wever //===----------------------------------------------------------------------===//
2*13249036SMark de Wever //
3*13249036SMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*13249036SMark de Wever // See https://llvm.org/LICENSE.txt for license information.
5*13249036SMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*13249036SMark de Wever //
7*13249036SMark de Wever //===----------------------------------------------------------------------===//
8*13249036SMark de Wever
9*13249036SMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17
10*13249036SMark de Wever // UNSUPPORTED: libcpp-has-no-incomplete-format
11*13249036SMark de Wever
12*13249036SMark de Wever // libc++ supports basic_format_string in C++20 as an extension
13*13249036SMark de Wever // UNSUPPORTED: !stdlib=libc++ && c++20
14*13249036SMark de Wever
15*13249036SMark de Wever // <format>
16*13249036SMark de Wever
17*13249036SMark de Wever // template<class charT, class... Args>
18*13249036SMark de Wever // class basic_format_string<charT, type_identity_t<Args>...>
19*13249036SMark de Wever //
20*13249036SMark de Wever // constexpr basic_string_view<charT> get() const noexcept { return str; }
21*13249036SMark de Wever
22*13249036SMark de Wever #include <format>
23*13249036SMark de Wever
24*13249036SMark de Wever #include <cassert>
25*13249036SMark de Wever #include <concepts>
26*13249036SMark de Wever #include <string_view>
27*13249036SMark de Wever
28*13249036SMark de Wever #include "test_macros.h"
29*13249036SMark de Wever #include "make_string.h"
30*13249036SMark de Wever
31*13249036SMark de Wever #define CSTR(S) MAKE_CSTRING(CharT, S)
32*13249036SMark de Wever #define SV(S) MAKE_STRING_VIEW(CharT, S)
33*13249036SMark de Wever
34*13249036SMark de Wever template <class CharT>
test()35*13249036SMark de Wever constexpr bool test() {
36*13249036SMark de Wever assert((std::basic_format_string<CharT>{CSTR("foo")}.get() == SV("foo")));
37*13249036SMark de Wever assert((std::basic_format_string<CharT, int>{CSTR("{}")}.get() == SV("{}")));
38*13249036SMark de Wever assert((std::basic_format_string<CharT, int, float>{CSTR("{} {:01.23L}")}.get() == SV("{} {:01.23L}")));
39*13249036SMark de Wever
40*13249036SMark de Wever // Embedded NUL character
41*13249036SMark de Wever assert((std::basic_format_string<CharT, void*, double>{SV("{}\0{}")}.get() == SV("{}\0{}")));
42*13249036SMark de Wever return true;
43*13249036SMark de Wever }
44*13249036SMark de Wever
main(int,char **)45*13249036SMark de Wever int main(int, char**) {
46*13249036SMark de Wever test<char>();
47*13249036SMark de Wever static_assert(test<char>());
48*13249036SMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS
49*13249036SMark de Wever test<wchar_t>();
50*13249036SMark de Wever static_assert(test<wchar_t>());
51*13249036SMark de Wever #endif
52*13249036SMark de Wever return 0;
53*13249036SMark de Wever }
54