xref: /llvm-project/libcxx/test/support/test_format_string.h (revision 8cd5e672602676877b9025a750b20f895ca0bc25)
1 // -*- C++ -*-
2 //===----------------------------------------------------------------------===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef SUPPORT_TEST_FORMAT_STRING_HPP
11 #define SUPPORT_TEST_FORMAT_STRING_HPP
12 
13 #include <concepts>
14 #include <format>
15 #include <type_traits>
16 
17 #include "test_macros.h"
18 
19 #if TEST_STD_VER < 20
20 #  error "The format header requires at least C++20"
21 #endif
22 
23 // Wrapper for basic_format_string.
24 //
25 // This layer of indirection is used since it's not possible to use
26 // std::basic_format_string<CharT, Args...> in the test function directly.
27 //
28 // In C++20 the basic-format-string was an exposition only type. In C++23 is
29 // has been replaced with basic_format_string. Both libc++ and MSVC STL offer
30 // it as an extension in C++20.
31 #if TEST_STD_VER > 20 || defined(_LIBCPP_VERSION) || defined(_MSVC_STL_VERSION)
32 #  ifndef TEST_HAS_NO_WIDE_CHARACTERS
33 template <class CharT, class... Args>
34 using test_format_string =
35     std::conditional_t<std::same_as<CharT, char>, std::format_string<Args...>, std::wformat_string<Args...>>;
36 #  else
37 template <class CharT, class... Args>
38 using test_format_string = std::format_string<Args...>;
39 #  endif
40 
41 #else // TEST_STD_VER > 20 || defined(_LIBCPP_VERSION) || defined( _MSVC_STL_VERSION)
42 
43 #  error                                                                                                               \
44       "Please create a vendor specific version of the test typedef and file a PR at https://github.com/llvm/llvm-project"
45 
46 #endif // TEST_STD_VER > 20 || defined(_LIBCPP_VERSION) || defined( _MSVC_STL_VERSION)
47 
48 #endif // SUPPORT_TEST_FORMAT_STRING_HPP
49