summaryrefslogtreecommitdiff
path: root/test/support/test_convertible.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/support/test_convertible.hpp')
-rw-r--r--test/support/test_convertible.hpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/test/support/test_convertible.hpp b/test/support/test_convertible.hpp
new file mode 100644
index 000000000000..787cef6568f2
--- /dev/null
+++ b/test/support/test_convertible.hpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef SUPPORT_TEST_CONVERTIBLE_HPP
+#define SUPPORT_TEST_CONVERTIBLE_HPP
+
+// "test_convertible<Tp, Args...>()" is a metafunction used to check if 'Tp'
+// is implicitly convertible from 'Args...' for any number of arguments,
+// Unlike 'std::is_convertible' which only allows checking for single argument
+// conversions.
+
+#include <type_traits>
+
+#include "test_macros.h"
+
+#if TEST_STD_VER < 11
+#error test_convertible.hpp requires C++11 or newer
+#endif
+
+namespace detail {
+ template <class Tp> void eat_type(Tp);
+
+ template <class Tp, class ...Args>
+ constexpr auto test_convertible_imp(int)
+ -> decltype(eat_type<Tp>({std::declval<Args>()...}), true)
+ { return true; }
+
+ template <class Tp, class ...Args>
+ constexpr auto test_convertible_imp(long) -> bool { return false; }
+}
+
+template <class Tp, class ...Args>
+constexpr bool test_convertible()
+{ return detail::test_convertible_imp<Tp, Args...>(0); }
+
+#endif // SUPPORT_TEST_CONVERTIBLE_HPP \ No newline at end of file