diff --git a/sycl/include/sycl/vector.hpp b/sycl/include/sycl/vector.hpp index 5671dfb514b1d..4d5f45a86cf99 100644 --- a/sycl/include/sycl/vector.hpp +++ b/sycl/include/sycl/vector.hpp @@ -309,8 +309,13 @@ template class ConversionToVecMixin { public: operator vec_ty() const { - vec_ty res{*static_cast(this)}; - return res; + auto &self = *static_cast(this); + if constexpr (vec_ty::size() == 1) + // Avoid recursion by explicitly going through `vec(const DataT &)` ctor. + return vec_ty{static_cast(self)}; + else + // Uses `vec`'s variadic ctor. + return vec_ty{self}; } }; @@ -398,9 +403,8 @@ class __SYCL_EBO Swizzle public ApplyIf>>, - public ApplyIf>>, + public ConversionToVecMixin< + Swizzle>, public NamedSwizzlesMixinBoth< Swizzle> { using Base = SwizzleBase>; diff --git a/sycl/test/basic_tests/vectors/cxx_conversions.cpp b/sycl/test/basic_tests/vectors/cxx_conversions.cpp index 4973b07cd00db..ba283d2c45a86 100644 --- a/sycl/test/basic_tests/vectors/cxx_conversions.cpp +++ b/sycl/test/basic_tests/vectors/cxx_conversions.cpp @@ -53,7 +53,7 @@ using sw_double_2 = decltype(std::declval>().swizzle<1, 2>()); static_assert( std::is_invocable_v); static_assert(EXCEPT_IN_PREVIEW std::is_invocable_v); static_assert(EXCEPT_IN_PREVIEW std::is_invocable_v); -static_assert(EXCEPT_IN_PREVIEW std::is_invocable_v); +static_assert( std::is_invocable_v); static_assert(EXCEPT_IN_PREVIEW std::is_invocable_v); static_assert(EXCEPT_IN_PREVIEW std::is_invocable_v); static_assert( std::is_invocable_v>); @@ -64,7 +64,7 @@ static_assert(EXCEPT_IN_PREVIEW std::is_invocable_v) static_assert( std::is_invocable_v); static_assert( std::is_invocable_v); static_assert(EXCEPT_IN_PREVIEW std::is_invocable_v); -static_assert(EXCEPT_IN_PREVIEW std::is_invocable_v); +static_assert( std::is_invocable_v); static_assert(EXCEPT_IN_PREVIEW std::is_invocable_v); static_assert(EXCEPT_IN_PREVIEW std::is_invocable_v>); static_assert( std::is_invocable_v>);