From bac110870088c93dd51cef284805aed91558f620 Mon Sep 17 00:00:00 2001 From: Andrei Elovikov Date: Tue, 1 Apr 2025 10:39:56 -0700 Subject: [PATCH] [SYCL] Add vec explicit conversion Implements KhronosGroup/SYCL-Docs#669. --- sycl/include/sycl/vector.hpp | 20 +++++++++++++++---- .../basic_tests/vectors/cxx_conversions.cpp | 6 ++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/sycl/include/sycl/vector.hpp b/sycl/include/sycl/vector.hpp index 06458a38e3d90..7dbc453367fcd 100644 --- a/sycl/include/sycl/vector.hpp +++ b/sycl/include/sycl/vector.hpp @@ -125,11 +125,23 @@ template class GetOp { // // must go throw `v.x()` returning a swizzle, then its `operator==` returning // vec and we want that code to compile. -template class ScalarConversionOperatorMixIn { - using T = typename from_incomplete::element_type; +template class ScalarConversionOperatorsMixIn { + using element_type = typename from_incomplete::element_type; public: - operator T() const { return (*static_cast(this))[0]; } + operator element_type() const { + return (*static_cast(this))[0]; + } + +#if !__SYCL_USE_LIBSYCL8_VEC_IMPL + template < + typename T, typename = std::enable_if_t>, + typename = + std::void_t(std::declval()))>> + explicit operator T() const { + return static_cast((*static_cast(this))[0]); + } +#endif }; template @@ -310,7 +322,7 @@ class __SYCL_EBO vec : public detail::vec_arith, public detail::ApplyIf< NumElements == 1, - detail::ScalarConversionOperatorMixIn>>, + detail::ScalarConversionOperatorsMixIn>>, public detail::NamedSwizzlesMixinBoth>, // Keep it last to simplify ABI layout test: public detail::vec_base { diff --git a/sycl/test/basic_tests/vectors/cxx_conversions.cpp b/sycl/test/basic_tests/vectors/cxx_conversions.cpp index 4466533945668..b59adc718c31f 100644 --- a/sycl/test/basic_tests/vectors/cxx_conversions.cpp +++ b/sycl/test/basic_tests/vectors/cxx_conversions.cpp @@ -39,8 +39,10 @@ using sw_double_2 = decltype(std::declval>().swizzle<1, 2>()); #if __INTEL_PREVIEW_BREAKING_CHANGES #define EXCEPT_IN_PREVIEW ! +#define PREVIEW_ONLY #else #define EXCEPT_IN_PREVIEW +#define PREVIEW_ONLY ! #endif // clang-format off @@ -128,8 +130,8 @@ static_assert( is_explicitly_convertible_to_v, ha 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(PREVIEW_ONLY is_explicitly_convertible_to_v, float>); +static_assert(PREVIEW_ONLY is_explicitly_convertible_to_v, double>); #endif static_assert( is_explicitly_convertible_to_v, half>);