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