diff --git a/sycl/include/sycl/buffer.hpp b/sycl/include/sycl/buffer.hpp index bd5ae684ad4ae..e3461798c8ec0 100644 --- a/sycl/include/sycl/buffer.hpp +++ b/sycl/include/sycl/buffer.hpp @@ -465,8 +465,8 @@ class buffer : public detail::buffer_plain, dimensions, sizeof(T), detail::rangeToArray(Range).data()); } - buffer(buffer &&rhs, - const detail::code_location CodeLoc = detail::code_location::current()) + buffer(buffer &&rhs, const detail::code_location CodeLoc = + detail::code_location::current()) noexcept : buffer_plain(std::move(rhs.impl)), Range(rhs.Range), OffsetInBytes(rhs.OffsetInBytes), IsSubBuffer(rhs.IsSubBuffer) { buffer_plain::constructorNotification( diff --git a/sycl/include/sycl/device.hpp b/sycl/include/sycl/device.hpp index 2d9ae463768a0..c92c4eb1633e9 100644 --- a/sycl/include/sycl/device.hpp +++ b/sycl/include/sycl/device.hpp @@ -116,7 +116,7 @@ class __SYCL_STANDALONE_DEBUG __SYCL_EXPORT device { #endif // __INTEL_PREVIEW_BREAKING_CHANGES device(const device &rhs); - device(device &&rhs); + device(device &&rhs) noexcept; device &operator=(const device &rhs) = default; diff --git a/sycl/include/sycl/h_item.hpp b/sycl/include/sycl/h_item.hpp index af1eb6200e4ca..044d9d821eb9c 100644 --- a/sycl/include/sycl/h_item.hpp +++ b/sycl/include/sycl/h_item.hpp @@ -36,8 +36,12 @@ template class h_item { h_item(const h_item &hi) = default; + h_item(h_item &&hi) = default; + h_item &operator=(const h_item &hi) = default; + h_item &operator=(h_item &&hi) = default; + /* -- public interface members -- */ item get_global() const { return globalItem; } diff --git a/sycl/source/device.cpp b/sycl/source/device.cpp index 2b7312ec2e861..8c96f627aacce 100644 --- a/sycl/source/device.cpp +++ b/sycl/source/device.cpp @@ -45,7 +45,7 @@ void force_type(info::device_type &t, const info::device_type &ft) { device::device() : device(default_selector_v) {} device::device(const device &rhs) = default; -device::device(device &&rhs) = default; +device::device(device &&rhs) noexcept = default; device::device(OpenCLDeviceIdT DeviceId) { detail::adapter_impl &Adapter = diff --git a/sycl/test/basic_tests/common_semantics_noexcept.cpp b/sycl/test/basic_tests/common_semantics_noexcept.cpp new file mode 100644 index 0000000000000..9bffbf0adf8b6 --- /dev/null +++ b/sycl/test/basic_tests/common_semantics_noexcept.cpp @@ -0,0 +1,107 @@ +// RUN: %clangxx -fsycl -fsyntax-only %s +// RUN: %clangxx -fsycl -fsyntax-only -fpreview-breaking-changes %s + +// Checks that the move constructor and the move assignment operator of every +// class with common reference semantics (SYCL 2020 section 3.5.2) and common +// by-value semantics (section 3.5.3) are declared noexcept, as required by +// tables 3 and 5. + +#include + +#include +#include + +template constexpr bool declaresMoveAssign(T &(T::*)(T &&)) { + return true; +} + +#define CHECK_MOVE_NOEXCEPT(...) \ + static_assert(std::is_nothrow_move_constructible_v<__VA_ARGS__>, \ + #__VA_ARGS__ " must be nothrow move constructible"); \ + static_assert(std::is_nothrow_move_assignable_v<__VA_ARGS__>, \ + #__VA_ARGS__ " must be nothrow move assignable"); \ + static_assert(declaresMoveAssign<__VA_ARGS__>(&__VA_ARGS__::operator=), \ + #__VA_ARGS__ " must declare operator=(" #__VA_ARGS__ " &&)"); + +// --- Common reference semantics (SYCL 2020 section 3.5.2) ------------------- + +CHECK_MOVE_NOEXCEPT(sycl::platform) +CHECK_MOVE_NOEXCEPT(sycl::device) +CHECK_MOVE_NOEXCEPT(sycl::context) +CHECK_MOVE_NOEXCEPT(sycl::queue) +CHECK_MOVE_NOEXCEPT(sycl::event) +CHECK_MOVE_NOEXCEPT(sycl::kernel) +CHECK_MOVE_NOEXCEPT(sycl::kernel_id) +CHECK_MOVE_NOEXCEPT(sycl::stream) + +CHECK_MOVE_NOEXCEPT(sycl::kernel_bundle) +CHECK_MOVE_NOEXCEPT(sycl::kernel_bundle) +CHECK_MOVE_NOEXCEPT(sycl::kernel_bundle) + +CHECK_MOVE_NOEXCEPT(sycl::device_image) +CHECK_MOVE_NOEXCEPT(sycl::device_image) +CHECK_MOVE_NOEXCEPT(sycl::device_image) + +CHECK_MOVE_NOEXCEPT(sycl::buffer) +CHECK_MOVE_NOEXCEPT(sycl::buffer) +CHECK_MOVE_NOEXCEPT(sycl::buffer) +CHECK_MOVE_NOEXCEPT(sycl::buffer>) + +CHECK_MOVE_NOEXCEPT(sycl::unsampled_image<1>) +CHECK_MOVE_NOEXCEPT(sycl::unsampled_image<2>) +CHECK_MOVE_NOEXCEPT(sycl::unsampled_image<3>) +CHECK_MOVE_NOEXCEPT(sycl::sampled_image<1>) +CHECK_MOVE_NOEXCEPT(sycl::sampled_image<2>) +CHECK_MOVE_NOEXCEPT(sycl::sampled_image<3>) + +CHECK_MOVE_NOEXCEPT( + sycl::accessor) +CHECK_MOVE_NOEXCEPT( + sycl::accessor) +CHECK_MOVE_NOEXCEPT( + sycl::accessor) +CHECK_MOVE_NOEXCEPT( + sycl::accessor) +CHECK_MOVE_NOEXCEPT(sycl::accessor) + +CHECK_MOVE_NOEXCEPT(sycl::local_accessor) +CHECK_MOVE_NOEXCEPT(sycl::local_accessor) +CHECK_MOVE_NOEXCEPT(sycl::local_accessor) + +CHECK_MOVE_NOEXCEPT(sycl::host_accessor) +CHECK_MOVE_NOEXCEPT(sycl::host_accessor) +CHECK_MOVE_NOEXCEPT(sycl::host_accessor) + +CHECK_MOVE_NOEXCEPT( + sycl::unsampled_image_accessor) +CHECK_MOVE_NOEXCEPT( + sycl::unsampled_image_accessor) +CHECK_MOVE_NOEXCEPT(sycl::host_unsampled_image_accessor) +CHECK_MOVE_NOEXCEPT(sycl::host_unsampled_image_accessor) +CHECK_MOVE_NOEXCEPT(sycl::sampled_image_accessor) +CHECK_MOVE_NOEXCEPT(sycl::sampled_image_accessor) +CHECK_MOVE_NOEXCEPT(sycl::host_sampled_image_accessor) +CHECK_MOVE_NOEXCEPT(sycl::host_sampled_image_accessor) + +// --- Common by-value semantics (SYCL 2020 section 3.5.3) ------------------- + +CHECK_MOVE_NOEXCEPT(sycl::id<1>) +CHECK_MOVE_NOEXCEPT(sycl::id<2>) +CHECK_MOVE_NOEXCEPT(sycl::id<3>) +CHECK_MOVE_NOEXCEPT(sycl::range<1>) +CHECK_MOVE_NOEXCEPT(sycl::range<2>) +CHECK_MOVE_NOEXCEPT(sycl::range<3>) +CHECK_MOVE_NOEXCEPT(sycl::item<1, true>) +CHECK_MOVE_NOEXCEPT(sycl::item<1, false>) +CHECK_MOVE_NOEXCEPT(sycl::item<3, true>) +CHECK_MOVE_NOEXCEPT(sycl::item<3, false>) +CHECK_MOVE_NOEXCEPT(sycl::nd_item<1>) +CHECK_MOVE_NOEXCEPT(sycl::nd_item<3>) +CHECK_MOVE_NOEXCEPT(sycl::h_item<1>) +CHECK_MOVE_NOEXCEPT(sycl::h_item<3>) +CHECK_MOVE_NOEXCEPT(sycl::group<1>) +CHECK_MOVE_NOEXCEPT(sycl::group<3>) +CHECK_MOVE_NOEXCEPT(sycl::sub_group) +CHECK_MOVE_NOEXCEPT(sycl::nd_range<1>) +CHECK_MOVE_NOEXCEPT(sycl::nd_range<3>)