// // 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. // //===----------------------------------------------------------------------===// // Test the ability of each function to be invoked #include #include #include #if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_MSC_VER) && _MSVC_LANG >= 201703L) # define CPP17_PERFORM_INVOCABLE_TEST #endif class A {}; enum E1 : unsigned char { rEd }; enum class E2 : unsigned char { red }; // rotr struct i_rotr { template __host__ __device__ constexpr auto operator()(T x) const -> decltype(cuda::std::rotr(x, 1U)); }; // rotl struct i_rotl { template __host__ __device__ constexpr auto operator()(T x) const -> decltype(cuda::std::rotl(x, 1U)); }; // popcount struct i_popcount { template __host__ __device__ constexpr auto operator()(T x) const -> decltype(cuda::std::popcount(x)); }; // countr_zero struct i_countr_zero { template __host__ __device__ constexpr auto operator()(T x) const -> decltype(cuda::std::countr_zero(x)); }; // countr_one struct i_countr_one { template __host__ __device__ constexpr auto operator()(T x) const -> decltype(cuda::std::countr_one(x)); }; // countl_zero struct i_countl_zero { template __host__ __device__ constexpr auto operator()(T x) const -> decltype(cuda::std::countl_zero(x)); }; // countl_one struct i_countl_one { template __host__ __device__ constexpr auto operator()(T x) const -> decltype(cuda::std::countl_one(x)); }; // bit_width struct i_bit_width { template __host__ __device__ constexpr auto operator()(T x) const -> decltype(cuda::std::bit_width(x)); }; // has_single_bit struct i_has_single_bit { template __host__ __device__ constexpr auto operator()(T x) const -> decltype(cuda::std::has_single_bit(x)); }; // bit_floor struct i_bit_floor { template __host__ __device__ constexpr auto operator()(T x) const -> decltype(cuda::std::bit_floor(x)); }; // bit_ceil struct i_bit_ceil { template __host__ __device__ constexpr auto operator()(T x) const -> decltype(cuda::std::bit_ceil(x)); }; template __host__ __device__ void test_invocable() { #if defined(CPP17_PERFORM_INVOCABLE_TEST) static_assert(cuda::std::is_invocable_v, ""); static_assert(cuda::std::is_invocable_v, ""); static_assert(cuda::std::is_invocable_v, ""); static_assert(cuda::std::is_invocable_v, ""); static_assert(cuda::std::is_invocable_v, ""); static_assert(cuda::std::is_invocable_v, ""); static_assert(cuda::std::is_invocable_v, ""); static_assert(cuda::std::is_invocable_v, ""); static_assert(cuda::std::is_invocable_v, ""); static_assert(cuda::std::is_invocable_v, ""); static_assert(cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); # if _CCCL_HAS_INT128() static_assert(cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); # endif // _CCCL_HAS_INT128() static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); static_assert(!cuda::std::is_invocable_v, ""); #endif // defined(CPP17_PERFORM_INVOCABLE_TEST) } int main(int, char**) { { test_invocable(); test_invocable(); test_invocable(); test_invocable(); test_invocable(); test_invocable(); test_invocable(); test_invocable(); test_invocable(); test_invocable(); test_invocable(); } return 0; }