blob: 322ef506de7347a4e5fd425b93b8382f53061c04 [file] [log] [blame]
Eric Fiselierc7979582016-06-17 19:46:40 +00001//===----------------------------------------------------------------------===//
2//
Chandler Carruth57b08b02019-01-19 10:56:40 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Eric Fiselierc7979582016-06-17 19:46:40 +00006//
7//===----------------------------------------------------------------------===//
8
9#ifndef SUPPORT_TEST_CONVERTIBLE_HPP
10#define SUPPORT_TEST_CONVERTIBLE_HPP
11
12// "test_convertible<Tp, Args...>()" is a metafunction used to check if 'Tp'
13// is implicitly convertible from 'Args...' for any number of arguments,
14// Unlike 'std::is_convertible' which only allows checking for single argument
15// conversions.
16
17#include <type_traits>
18
19#include "test_macros.h"
20
21#if TEST_STD_VER < 11
22#error test_convertible.hpp requires C++11 or newer
23#endif
24
25namespace detail {
26 template <class Tp> void eat_type(Tp);
27
28 template <class Tp, class ...Args>
29 constexpr auto test_convertible_imp(int)
30 -> decltype(eat_type<Tp>({std::declval<Args>()...}), true)
31 { return true; }
32
33 template <class Tp, class ...Args>
34 constexpr auto test_convertible_imp(long) -> bool { return false; }
35}
36
37template <class Tp, class ...Args>
38constexpr bool test_convertible()
39{ return detail::test_convertible_imp<Tp, Args...>(0); }
40
Stephan T. Lavavejd29b12e2017-07-29 00:55:22 +000041#endif // SUPPORT_TEST_CONVERTIBLE_HPP