xref: /llvm-project/libcxx/test/support/test_convertible.h (revision 09e3a360581dc36d0820d3fb6da9bd7cfed87b5d)
1cc89063bSNico Weber //===----------------------------------------------------------------------===//
2cc89063bSNico Weber //
3cc89063bSNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4cc89063bSNico Weber // See https://llvm.org/LICENSE.txt for license information.
5cc89063bSNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6cc89063bSNico Weber //
7cc89063bSNico Weber //===----------------------------------------------------------------------===//
8cc89063bSNico Weber 
9cc89063bSNico Weber #ifndef SUPPORT_TEST_CONVERTIBLE_H
10cc89063bSNico Weber #define SUPPORT_TEST_CONVERTIBLE_H
11cc89063bSNico Weber 
12cc89063bSNico Weber // "test_convertible<Tp, Args...>()" is a metafunction used to check if 'Tp'
13cc89063bSNico Weber // is implicitly convertible from 'Args...' for any number of arguments,
14cc89063bSNico Weber // Unlike 'std::is_convertible' which only allows checking for single argument
15cc89063bSNico Weber // conversions.
16cc89063bSNico Weber 
17*09e3a360SLouis Dionne #include <utility>
18cc89063bSNico Weber 
19cc89063bSNico Weber #include "test_macros.h"
20cc89063bSNico Weber 
21cc89063bSNico Weber #if TEST_STD_VER < 11
22cc89063bSNico Weber #error test_convertible.h requires C++11 or newer
23cc89063bSNico Weber #endif
24cc89063bSNico Weber 
25cc89063bSNico Weber namespace detail {
26cc89063bSNico Weber     template <class Tp> void eat_type(Tp);
27cc89063bSNico Weber 
28cc89063bSNico Weber     template <class Tp, class ...Args>
29cc89063bSNico Weber     constexpr auto test_convertible_imp(int)
30cc89063bSNico Weber         -> decltype(eat_type<Tp>({std::declval<Args>()...}), true)
31cc89063bSNico Weber     { return true; }
32cc89063bSNico Weber 
33cc89063bSNico Weber     template <class Tp, class ...Args>
34cc89063bSNico Weber     constexpr auto test_convertible_imp(long) -> bool { return false; }
35cc89063bSNico Weber }
36cc89063bSNico Weber 
37cc89063bSNico Weber template <class Tp, class ...Args>
38cc89063bSNico Weber constexpr bool test_convertible()
39cc89063bSNico Weber { return detail::test_convertible_imp<Tp, Args...>(0); }
40cc89063bSNico Weber 
41cc89063bSNico Weber #endif // SUPPORT_TEST_CONVERTIBLE_H
42