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