From 80c6fe3c0513784c9d29d9bdd2b4f6d9e77fdbf0 Mon Sep 17 00:00:00 2001 From: Andrei Elovikov Date: Fri, 28 Mar 2025 13:15:17 -0700 Subject: [PATCH 1/2] [NFC][SYCL] Add few `vec` tests to document current behavior These will be updated as I upload PRs to implement recent specification changes. --- sycl/test/basic_tests/vectors/assign.cpp | 76 ++++++++++ .../basic_tests/vectors/cxx_conversions.cpp | 130 ++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 sycl/test/basic_tests/vectors/assign.cpp create mode 100644 sycl/test/basic_tests/vectors/cxx_conversions.cpp diff --git a/sycl/test/basic_tests/vectors/assign.cpp b/sycl/test/basic_tests/vectors/assign.cpp new file mode 100644 index 0000000000000..dea275b587b16 --- /dev/null +++ b/sycl/test/basic_tests/vectors/assign.cpp @@ -0,0 +1,76 @@ +// RUN: %clangxx -fsycl -fsyntax-only %s -fpreview-breaking-changes +// RUN: %clangxx -fsycl -fsyntax-only %s + +#include + +using sycl::half; +using sycl::vec; +using sw_half_1 = decltype(std::declval>().swizzle<1>()); +using sw_half_2 = decltype(std::declval>().swizzle<1, 2>()); + +using sw_float_1 = decltype(std::declval>().swizzle<1>()); +using sw_float_2 = decltype(std::declval>().swizzle<1, 2>()); + +using sw_double_1 = decltype(std::declval>().swizzle<1>()); +using sw_double_2 = decltype(std::declval>().swizzle<1, 2>()); + +// clang-format off + +// NOTE: Empty space is for the future markup using NOT_IN_PREVIEW/PREVIEW_ONLY +// macros. + +static_assert( std::is_assignable_v, half>); +static_assert( std::is_assignable_v, float>); +static_assert( std::is_assignable_v, double>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, sw_half_1>); +static_assert( std::is_assignable_v, sw_float_1>); +static_assert( std::is_assignable_v, sw_double_1>); +static_assert( !std::is_assignable_v, sw_half_2>); +static_assert( !std::is_assignable_v, sw_float_2>); +static_assert( !std::is_assignable_v, sw_double_2>); + +static_assert( std::is_assignable_v, half>); +static_assert( std::is_assignable_v, float>); +static_assert( std::is_assignable_v, double>); +static_assert( std::is_assignable_v, vec>); +static_assert( !std::is_assignable_v, vec>); +static_assert( !std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, sw_half_1>); +static_assert( std::is_assignable_v, sw_float_1>); +static_assert( std::is_assignable_v, sw_double_1>); +static_assert( std::is_assignable_v, sw_half_2>); +static_assert( !std::is_assignable_v, sw_float_2>); +static_assert( !std::is_assignable_v, sw_double_2>); + +static_assert( std::is_assignable_v, half>); +static_assert( std::is_assignable_v, float>); +static_assert( std::is_assignable_v, double>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, sw_half_1>); +static_assert( std::is_assignable_v, sw_float_1>); +static_assert( std::is_assignable_v, sw_double_1>); +static_assert( !std::is_assignable_v, sw_half_2>); +static_assert( !std::is_assignable_v, sw_float_2>); +static_assert( !std::is_assignable_v, sw_double_2>); + +static_assert( std::is_assignable_v, half>); +static_assert( std::is_assignable_v, float>); +static_assert( std::is_assignable_v, double>); +#if __SYCL_DEVICE_ONLY__ +static_assert( std::is_assignable_v, vec>); +#else +static_assert( !std::is_assignable_v, vec>); +#endif +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, sw_half_1>); +static_assert( std::is_assignable_v, sw_float_1>); +static_assert( std::is_assignable_v, sw_double_1>); +static_assert( !std::is_assignable_v, sw_half_2>); +static_assert( std::is_assignable_v, sw_float_2>); +static_assert( !std::is_assignable_v, sw_double_2>); diff --git a/sycl/test/basic_tests/vectors/cxx_conversions.cpp b/sycl/test/basic_tests/vectors/cxx_conversions.cpp new file mode 100644 index 0000000000000..512f729d48c25 --- /dev/null +++ b/sycl/test/basic_tests/vectors/cxx_conversions.cpp @@ -0,0 +1,130 @@ +// RUN: %clangxx -fsycl -fsyntax-only %s -fpreview-breaking-changes +// RUN: %clangxx -fsycl -fsyntax-only %s + +#include + +template +struct is_explicitly_convertible_to_impl : std::false_type {}; + +template +struct is_explicitly_convertible_to_impl< + From, To, std::void_t(std::declval()))>> + : std::true_type {}; + +template +struct is_explicitly_convertible_to + : is_explicitly_convertible_to_impl {}; + +template +inline constexpr bool is_explicitly_convertible_to_v = + is_explicitly_convertible_to::value; + +using sycl::half; +using sycl::vec; + +void f_half_v1(vec); +void f_half_v4(vec); +void f_float_v1(vec); +void f_float_v4(vec); + +using sw_half_1 = decltype(std::declval>().swizzle<1>()); +using sw_half_2 = decltype(std::declval>().swizzle<1, 2>()); + +using sw_float_1 = decltype(std::declval>().swizzle<1>()); +using sw_float_2 = decltype(std::declval>().swizzle<1, 2>()); + +using sw_double_1 = decltype(std::declval>().swizzle<1>()); +using sw_double_2 = decltype(std::declval>().swizzle<1, 2>()); + +// clang-format off + +// NOTE: Empty space is for the future markup using NOT_IN_PREVIEW/PREVIEW_ONLY +// macros. + +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v>); +static_assert( std::is_invocable_v>); +static_assert( std::is_invocable_v>); + +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v>); +static_assert( std::is_invocable_v>); +static_assert( std::is_invocable_v>); + +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); + +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); + +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); + +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); + +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); + +static_assert( is_explicitly_convertible_to_v, half>); +#if __SYCL_DEVICE_ONLY__ +static_assert( is_explicitly_convertible_to_v, float>); +static_assert( is_explicitly_convertible_to_v, double>); +#else +static_assert( !is_explicitly_convertible_to_v, float>); +static_assert( !is_explicitly_convertible_to_v, double>); +#endif + +static_assert( is_explicitly_convertible_to_v, half>); +static_assert( is_explicitly_convertible_to_v, float>); +static_assert( is_explicitly_convertible_to_v, double>); From cb22962b92afe38876e1e95e1cd131bf09fa26a7 Mon Sep 17 00:00:00 2001 From: Andrei Elovikov Date: Mon, 31 Mar 2025 10:25:05 -0700 Subject: [PATCH 2/2] Let's settle on "future" macros here --- sycl/test/basic_tests/vectors/assign.cpp | 101 ++++++----- .../basic_tests/vectors/cxx_conversions.cpp | 170 +++++++++--------- 2 files changed, 139 insertions(+), 132 deletions(-) diff --git a/sycl/test/basic_tests/vectors/assign.cpp b/sycl/test/basic_tests/vectors/assign.cpp index dea275b587b16..ca8f185d7a296 100644 --- a/sycl/test/basic_tests/vectors/assign.cpp +++ b/sycl/test/basic_tests/vectors/assign.cpp @@ -19,58 +19,61 @@ using sw_double_2 = decltype(std::declval>().swizzle<1, 2>()); // NOTE: Empty space is for the future markup using NOT_IN_PREVIEW/PREVIEW_ONLY // macros. -static_assert( std::is_assignable_v, half>); -static_assert( std::is_assignable_v, float>); -static_assert( std::is_assignable_v, double>); -static_assert( std::is_assignable_v, vec>); -static_assert( std::is_assignable_v, vec>); -static_assert( std::is_assignable_v, vec>); -static_assert( std::is_assignable_v, sw_half_1>); -static_assert( std::is_assignable_v, sw_float_1>); -static_assert( std::is_assignable_v, sw_double_1>); -static_assert( !std::is_assignable_v, sw_half_2>); -static_assert( !std::is_assignable_v, sw_float_2>); -static_assert( !std::is_assignable_v, sw_double_2>); +// IN_PREVIEW_ONLY condition<> +// EXCEPT_IN_PREVIEW condition<> -static_assert( std::is_assignable_v, half>); -static_assert( std::is_assignable_v, float>); -static_assert( std::is_assignable_v, double>); -static_assert( std::is_assignable_v, vec>); -static_assert( !std::is_assignable_v, vec>); -static_assert( !std::is_assignable_v, vec>); -static_assert( std::is_assignable_v, sw_half_1>); -static_assert( std::is_assignable_v, sw_float_1>); -static_assert( std::is_assignable_v, sw_double_1>); -static_assert( std::is_assignable_v, sw_half_2>); -static_assert( !std::is_assignable_v, sw_float_2>); -static_assert( !std::is_assignable_v, sw_double_2>); +static_assert( std::is_assignable_v, half>); +static_assert( std::is_assignable_v, float>); +static_assert( std::is_assignable_v, double>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, sw_half_1>); +static_assert( std::is_assignable_v, sw_float_1>); +static_assert( std::is_assignable_v, sw_double_1>); +static_assert( !std::is_assignable_v, sw_half_2>); +static_assert( !std::is_assignable_v, sw_float_2>); +static_assert( !std::is_assignable_v, sw_double_2>); -static_assert( std::is_assignable_v, half>); -static_assert( std::is_assignable_v, float>); -static_assert( std::is_assignable_v, double>); -static_assert( std::is_assignable_v, vec>); -static_assert( std::is_assignable_v, vec>); -static_assert( std::is_assignable_v, vec>); -static_assert( std::is_assignable_v, sw_half_1>); -static_assert( std::is_assignable_v, sw_float_1>); -static_assert( std::is_assignable_v, sw_double_1>); -static_assert( !std::is_assignable_v, sw_half_2>); -static_assert( !std::is_assignable_v, sw_float_2>); -static_assert( !std::is_assignable_v, sw_double_2>); +static_assert( std::is_assignable_v, half>); +static_assert( std::is_assignable_v, float>); +static_assert( std::is_assignable_v, double>); +static_assert( std::is_assignable_v, vec>); +static_assert( !std::is_assignable_v, vec>); +static_assert( !std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, sw_half_1>); +static_assert( std::is_assignable_v, sw_float_1>); +static_assert( std::is_assignable_v, sw_double_1>); +static_assert( std::is_assignable_v, sw_half_2>); +static_assert( !std::is_assignable_v, sw_float_2>); +static_assert( !std::is_assignable_v, sw_double_2>); -static_assert( std::is_assignable_v, half>); -static_assert( std::is_assignable_v, float>); -static_assert( std::is_assignable_v, double>); +static_assert( std::is_assignable_v, half>); +static_assert( std::is_assignable_v, float>); +static_assert( std::is_assignable_v, double>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, sw_half_1>); +static_assert( std::is_assignable_v, sw_float_1>); +static_assert( std::is_assignable_v, sw_double_1>); +static_assert( !std::is_assignable_v, sw_half_2>); +static_assert( !std::is_assignable_v, sw_float_2>); +static_assert( !std::is_assignable_v, sw_double_2>); + +static_assert( std::is_assignable_v, half>); +static_assert( std::is_assignable_v, float>); +static_assert( std::is_assignable_v, double>); #if __SYCL_DEVICE_ONLY__ -static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, vec>); #else -static_assert( !std::is_assignable_v, vec>); +static_assert( !std::is_assignable_v, vec>); #endif -static_assert( std::is_assignable_v, vec>); -static_assert( std::is_assignable_v, vec>); -static_assert( std::is_assignable_v, sw_half_1>); -static_assert( std::is_assignable_v, sw_float_1>); -static_assert( std::is_assignable_v, sw_double_1>); -static_assert( !std::is_assignable_v, sw_half_2>); -static_assert( std::is_assignable_v, sw_float_2>); -static_assert( !std::is_assignable_v, sw_double_2>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, vec>); +static_assert( std::is_assignable_v, sw_half_1>); +static_assert( std::is_assignable_v, sw_float_1>); +static_assert( std::is_assignable_v, sw_double_1>); +static_assert( !std::is_assignable_v, sw_half_2>); +static_assert( std::is_assignable_v, sw_float_2>); +static_assert( !std::is_assignable_v, sw_double_2>); diff --git a/sycl/test/basic_tests/vectors/cxx_conversions.cpp b/sycl/test/basic_tests/vectors/cxx_conversions.cpp index 512f729d48c25..fb337c0e09e56 100644 --- a/sycl/test/basic_tests/vectors/cxx_conversions.cpp +++ b/sycl/test/basic_tests/vectors/cxx_conversions.cpp @@ -41,90 +41,94 @@ using sw_double_2 = decltype(std::declval>().swizzle<1, 2>()); // NOTE: Empty space is for the future markup using NOT_IN_PREVIEW/PREVIEW_ONLY // macros. -static_assert( std::is_invocable_v); -static_assert( std::is_invocable_v); -static_assert( std::is_invocable_v); -static_assert( std::is_invocable_v); -static_assert( std::is_invocable_v); -static_assert( std::is_invocable_v); -static_assert( std::is_invocable_v>); -static_assert( std::is_invocable_v>); -static_assert( std::is_invocable_v>); - -static_assert( std::is_invocable_v); -static_assert( std::is_invocable_v); -static_assert( std::is_invocable_v); -static_assert( std::is_invocable_v); -static_assert( std::is_invocable_v); -static_assert( std::is_invocable_v); -static_assert( std::is_invocable_v>); -static_assert( std::is_invocable_v>); -static_assert( std::is_invocable_v>); - -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); - -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); -static_assert( !std::is_invocable_v); - -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); - -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); - -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( !is_explicitly_convertible_to_v>); -static_assert( !is_explicitly_convertible_to_v>); -static_assert( !is_explicitly_convertible_to_v>); -static_assert( !is_explicitly_convertible_to_v>); -static_assert( !is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( !is_explicitly_convertible_to_v>); -static_assert( !is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); -static_assert( is_explicitly_convertible_to_v>); - -static_assert( is_explicitly_convertible_to_v, half>); + +// IN_PREVIEW_ONLY condition<> +// EXCEPT_IN_PREVIEW condition<> + +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v>); +static_assert( std::is_invocable_v>); +static_assert( std::is_invocable_v>); + +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert( std::is_invocable_v>); +static_assert( std::is_invocable_v>); +static_assert( std::is_invocable_v>); + +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); + +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); +static_assert( !std::is_invocable_v); + +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); + +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); + +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( !is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); +static_assert( is_explicitly_convertible_to_v>); + +static_assert( is_explicitly_convertible_to_v, half>); #if __SYCL_DEVICE_ONLY__ -static_assert( is_explicitly_convertible_to_v, float>); -static_assert( is_explicitly_convertible_to_v, double>); +static_assert( is_explicitly_convertible_to_v, float>); +static_assert( is_explicitly_convertible_to_v, double>); #else -static_assert( !is_explicitly_convertible_to_v, float>); -static_assert( !is_explicitly_convertible_to_v, double>); +static_assert( !is_explicitly_convertible_to_v, float>); +static_assert( !is_explicitly_convertible_to_v, double>); #endif -static_assert( is_explicitly_convertible_to_v, half>); -static_assert( is_explicitly_convertible_to_v, float>); -static_assert( is_explicitly_convertible_to_v, double>); +static_assert( is_explicitly_convertible_to_v, half>); +static_assert( is_explicitly_convertible_to_v, float>); +static_assert( is_explicitly_convertible_to_v, double>);