From 13b36cc80256bf29cbbc47e2cb463d62aeea4bfa Mon Sep 17 00:00:00 2001 From: Denis Bakhvalov Date: Mon, 19 Jul 2021 18:28:28 -0700 Subject: [PATCH] [ESIMD][NFC] Added tests for simd class type traits --- sycl/test/esimd/regression/simd_wrapper.cpp | 28 +++++++++++++++++++++ sycl/test/esimd/simd.cpp | 23 +++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 sycl/test/esimd/regression/simd_wrapper.cpp diff --git a/sycl/test/esimd/regression/simd_wrapper.cpp b/sycl/test/esimd/regression/simd_wrapper.cpp new file mode 100644 index 0000000000000..0655e220a6e73 --- /dev/null +++ b/sycl/test/esimd/regression/simd_wrapper.cpp @@ -0,0 +1,28 @@ +// RUN: %clangxx -fsycl -fsyntax-only -Xclang -verify %s + +#include +#include +#include + +// This is a regression test for simd object being non-trivial copy +// constructible. In order to fix it, you need to provide copy constructor for +// SimdWrapper, e.g.: +// SimdWrapper (const SimdWrapper& rhs) : v1(rhs.v1) {} + +using namespace sycl::ext::intel::experimental::esimd; + +struct SimdWrapper { + union { + // expected-note@+1 {{copy constructor of 'SimdWrapper' is implicitly deleted because variant field '' has a non-trivial copy constructor}} + struct { + simd v1; + }; + }; + SimdWrapper() {} +}; + +void encapsulate_simd() SYCL_ESIMD_FUNCTION { + SimdWrapper s1; + // expected-error@+1 {{call to implicitly-deleted copy constructor of 'SimdWrapper'}} + SimdWrapper s2(s1); +} diff --git a/sycl/test/esimd/simd.cpp b/sycl/test/esimd/simd.cpp index 9a6dc5293b15a..5b19035211d15 100644 --- a/sycl/test/esimd/simd.cpp +++ b/sycl/test/esimd/simd.cpp @@ -15,6 +15,29 @@ bool test_simd_ctors() SYCL_ESIMD_FUNCTION { return v0[0] + v1[1] + v2[2] + v3[3] == 1 + 1 + 2 + 6; } +void test_simd_class_traits() SYCL_ESIMD_FUNCTION { + static_assert(std::is_default_constructible>::value, + "type trait mismatch"); + static_assert(std::is_trivially_default_constructible>::value, + "type trait mismatch"); + static_assert(std::is_copy_constructible>::value, + "type trait mismatch"); + static_assert(!std::is_trivially_copy_constructible>::value, + "type trait mismatch"); + static_assert(std::is_move_constructible>::value, + "type trait mismatch"); + static_assert(!std::is_trivially_move_constructible>::value, + "type trait mismatch"); + static_assert(std::is_copy_assignable>::value, + "type trait mismatch"); + static_assert(std::is_trivially_copy_assignable>::value, + "type trait mismatch"); + static_assert(std::is_move_assignable>::value, + "type trait mismatch"); + static_assert(std::is_trivially_move_assignable>::value, + "type trait mismatch"); +} + void test_conversion() SYCL_ESIMD_FUNCTION { simd v = 3; simd f = v;