1//===----------------------------------------------------------------------===//
2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
3// See https://llvm.org/LICENSE.txt for license information.
4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5//
6//===----------------------------------------------------------------------===//
7
8// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
9
10// UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME
11
12// <format>
13
14// template<class charT, formattable<charT>... Ts>
15// struct formatter<pair-or-tuple<Ts...>, charT>
16
17// template<class ParseContext>
18// constexpr typename ParseContext::iterator
19// parse(ParseContext& ctx);
20
21// Note this tests the basics of this function. It's tested in more detail in
22// the format functions tests.
23
24#include <cassert>
25#include <concepts>
26#include <format>
27#include <memory>
28#include <tuple>
29#include <utility>
30
31#include "test_macros.h"
32#include "make_string.h"
33
34#define SV(S) MAKE_STRING_VIEW(CharT, S)
35
36template <class Arg, class StringViewT>
37constexpr void test(StringViewT fmt, std::size_t offset) {
38 using CharT = typename StringViewT::value_type;
39 auto parse_ctx = std::basic_format_parse_context<CharT>(fmt);
40 std::formatter<Arg, CharT> formatter;
41 static_assert(std::semiregular<decltype(formatter)>);
42
43 std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
44 // std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
45 assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
46}
47
48template <class CharT, class Arg>
49constexpr void test() {
50 test<Arg>(SV(""), 0);
51 test<Arg>(SV("42"), 0);
52
53 test<Arg>(SV("}"), 1);
54 test<Arg>(SV("42}"), 1);
55}
56
57template <class CharT>
58constexpr void test() {
59 test<CharT, std::tuple<int>>();
60 test<CharT, std::tuple<int, CharT>>();
61 test<CharT, std::pair<int, CharT>>();
62 test<CharT, std::tuple<int, CharT, bool>>();
63}
64
65constexpr bool test() {
66 test<char>();
67#ifndef TEST_HAS_NO_WIDE_CHARACTERS
68 test<wchar_t>();
69#endif
70
71 return true;
72}
73
74int main(int, char**) {
75 test();
76 static_assert(test());
77
78 return 0;
79}
80

source code of libcxx/test/std/utilities/format/format.tuple/parse.pass.cpp