1a09b1dc1SMark de Wever //===----------------------------------------------------------------------===// 2*6a54dfbfSLouis Dionne // 3a09b1dc1SMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4a09b1dc1SMark de Wever // See https://llvm.org/LICENSE.txt for license information. 5a09b1dc1SMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a09b1dc1SMark de Wever // 7a09b1dc1SMark de Wever //===----------------------------------------------------------------------===// 8a09b1dc1SMark de Wever 9a09b1dc1SMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 10a09b1dc1SMark de Wever 11520c7fbbSLouis Dionne // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME 12af5fc4b4SMark de Wever 13a09b1dc1SMark de Wever // <vector> 14a09b1dc1SMark de Wever 15a09b1dc1SMark de Wever // template<class T, class charT> 16a09b1dc1SMark de Wever // requires is-vector-bool-reference<T> 17a09b1dc1SMark de Wever // struct formatter<T, charT> 18a09b1dc1SMark de Wever 19a09b1dc1SMark de Wever // template<class ParseContext> 20a09b1dc1SMark de Wever // constexpr typename ParseContext::iterator 21a09b1dc1SMark de Wever // parse(ParseContext& ctx); 22a09b1dc1SMark de Wever 23a09b1dc1SMark de Wever // Note this tests the basics of this function. It's tested in more detail in 24a09b1dc1SMark de Wever // the format functions test. 25a09b1dc1SMark de Wever 26a09b1dc1SMark de Wever #include <cassert> 27a09b1dc1SMark de Wever #include <concepts> 28a09b1dc1SMark de Wever #include <format> 2963ae5099SA. Jiang #include <memory> 30a09b1dc1SMark de Wever #include <vector> 31a09b1dc1SMark de Wever 32a09b1dc1SMark de Wever #include "test_macros.h" 33a09b1dc1SMark de Wever #include "make_string.h" 34a09b1dc1SMark de Wever 35a09b1dc1SMark de Wever #define SV(S) MAKE_STRING_VIEW(CharT, S) 36a09b1dc1SMark de Wever 37a09b1dc1SMark de Wever template <class StringViewT> 383acf9b9cSMark de Wever constexpr void test_parse(StringViewT fmt, std::size_t offset) { 39a09b1dc1SMark de Wever using CharT = typename StringViewT::value_type; 40a09b1dc1SMark de Wever auto parse_ctx = std::basic_format_parse_context<CharT>(fmt); 41a09b1dc1SMark de Wever std::formatter<std::vector<bool, std::allocator<bool>>::reference, CharT> formatter; 42a09b1dc1SMark de Wever static_assert(std::semiregular<decltype(formatter)>); 43a09b1dc1SMark de Wever 44a09b1dc1SMark 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); 47a09b1dc1SMark de Wever } 48a09b1dc1SMark de Wever 49a09b1dc1SMark de Wever template <class CharT> 50a09b1dc1SMark de Wever constexpr void test_fmt() { 513acf9b9cSMark de Wever test_parse(SV(""), 0); 523acf9b9cSMark de Wever test_parse(SV("b"), 0); 53a09b1dc1SMark de Wever 543acf9b9cSMark de Wever test_parse(SV("}"), 1); 553acf9b9cSMark de Wever test_parse(SV("b}"), 1); 56a09b1dc1SMark de Wever } 57a09b1dc1SMark de Wever 58a09b1dc1SMark de Wever constexpr bool test() { 59a09b1dc1SMark de Wever test_fmt<char>(); 60a09b1dc1SMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS 61a09b1dc1SMark de Wever test_fmt<wchar_t>(); 62a09b1dc1SMark de Wever #endif 63a09b1dc1SMark de Wever 64a09b1dc1SMark de Wever return true; 65a09b1dc1SMark de Wever } 66a09b1dc1SMark de Wever 67a09b1dc1SMark de Wever int main(int, char**) { 68a09b1dc1SMark de Wever test(); 69a09b1dc1SMark de Wever static_assert(test()); 70a09b1dc1SMark de Wever 71a09b1dc1SMark de Wever return 0; 72a09b1dc1SMark de Wever } 73