188622aabSMark de Wever //===----------------------------------------------------------------------===// 2*6a54dfbfSLouis Dionne // 388622aabSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 488622aabSMark de Wever // See https://llvm.org/LICENSE.txt for license information. 588622aabSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 688622aabSMark de Wever // 788622aabSMark de Wever //===----------------------------------------------------------------------===// 888622aabSMark de Wever 988622aabSMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 1088622aabSMark de Wever // UNSUPPORTED: no-threads 1188622aabSMark de Wever 12520c7fbbSLouis Dionne // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME 1388622aabSMark de Wever 1488622aabSMark de Wever // <thread> 1588622aabSMark de Wever 1688622aabSMark de Wever // template<class charT> 1788622aabSMark de Wever // struct formatter<thread::id, charT>; 1888622aabSMark de Wever 1988622aabSMark de Wever // template<class ParseContext> 2088622aabSMark de Wever // constexpr typename ParseContext::iterator 2188622aabSMark de Wever // parse(ParseContext& ctx); 2288622aabSMark de Wever 2388622aabSMark de Wever // Note this tests the basics of this function. It's tested in more detail in 2488622aabSMark de Wever // the format functions test. 2588622aabSMark de Wever 2688622aabSMark de Wever #include <cassert> 2788622aabSMark de Wever #include <concepts> 2817f00620SNikolas Klauser #include <format> 2963ae5099SA. Jiang #include <memory> 3088622aabSMark de Wever #include <thread> 3188622aabSMark de Wever 3288622aabSMark de Wever #include "test_macros.h" 3388622aabSMark de Wever #include "make_string.h" 3488622aabSMark de Wever 3588622aabSMark de Wever #define SV(S) MAKE_STRING_VIEW(CharT, S) 3688622aabSMark de Wever 3788622aabSMark de Wever template <class StringViewT> 383acf9b9cSMark de Wever constexpr void test_parse(StringViewT fmt, std::size_t offset) { 3988622aabSMark de Wever using CharT = typename StringViewT::value_type; 4088622aabSMark de Wever auto parse_ctx = std::basic_format_parse_context<CharT>(fmt); 4188622aabSMark de Wever std::formatter<std::thread::id, CharT> formatter; 4288622aabSMark de Wever static_assert(std::semiregular<decltype(formatter)>); 4388622aabSMark de Wever 4488622aabSMark 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); 4788622aabSMark de Wever } 4888622aabSMark de Wever 4988622aabSMark de Wever template <class CharT> 5088622aabSMark de Wever constexpr void test_fmt() { 513acf9b9cSMark de Wever test_parse(SV(""), 0); 523acf9b9cSMark de Wever test_parse(SV("1"), 0); 5388622aabSMark de Wever 543acf9b9cSMark de Wever test_parse(SV("}"), 1); 553acf9b9cSMark de Wever test_parse(SV("1}"), 1); 5688622aabSMark de Wever } 5788622aabSMark de Wever 5888622aabSMark de Wever constexpr bool test() { 5988622aabSMark de Wever test_fmt<char>(); 6088622aabSMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS 6188622aabSMark de Wever test_fmt<wchar_t>(); 6288622aabSMark de Wever #endif 6388622aabSMark de Wever 6488622aabSMark de Wever return true; 6588622aabSMark de Wever } 6688622aabSMark de Wever 6788622aabSMark de Wever int main(int, char**) { 6888622aabSMark de Wever test(); 6988622aabSMark de Wever static_assert(test()); 7088622aabSMark de Wever 7188622aabSMark de Wever return 0; 7288622aabSMark de Wever } 73