diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 125944e6c10eb..b694dfe525ae9 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -889,6 +889,7 @@ class accessor : getAdjustedMode(PropertyList), detail::getSyclObjImpl(BufferRef).get(), AdjustedDim, sizeof(DataT), BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) { + checkDeviceAccessorBufferSize(BufferRef.get_count()); if (!IsPlaceH) addHostAccessorAndWait(AccessorBaseHost::impl.get()); #endif @@ -912,6 +913,7 @@ class accessor : getAdjustedMode(PropertyList), detail::getSyclObjImpl(BufferRef).get(), Dimensions, sizeof(DataT), BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) { + checkDeviceAccessorBufferSize(BufferRef.get_count()); detail::associateWithHandler(CommandGroupHandler, this, AccessTarget); } #endif @@ -935,6 +937,7 @@ class accessor : getAdjustedMode(PropertyList), detail::getSyclObjImpl(BufferRef).get(), Dimensions, sizeof(DataT), BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) { + checkDeviceAccessorBufferSize(BufferRef.get_count()); if (!IsPlaceH) addHostAccessorAndWait(AccessorBaseHost::impl.get()); } @@ -972,6 +975,7 @@ class accessor : getAdjustedMode(PropertyList), detail::getSyclObjImpl(BufferRef).get(), Dimensions, sizeof(DataT), BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) { + checkDeviceAccessorBufferSize(BufferRef.get_count()); detail::associateWithHandler(CommandGroupHandler, this, AccessTarget); } #endif @@ -1058,6 +1062,7 @@ class accessor : detail::getSyclObjImpl(BufferRef).get(), Dimensions, sizeof(DataT), BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) { + checkDeviceAccessorBufferSize(BufferRef.get_count()); if (!IsPlaceH) addHostAccessorAndWait(AccessorBaseHost::impl.get()); } @@ -1097,6 +1102,7 @@ class accessor : detail::getSyclObjImpl(BufferRef).get(), Dimensions, sizeof(DataT), BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) { + checkDeviceAccessorBufferSize(BufferRef.get_count()); detail::associateWithHandler(CommandGroupHandler, this, AccessTarget); } #endif @@ -1219,6 +1225,15 @@ class accessor : bool operator==(const accessor &Rhs) const { return impl == Rhs.impl; } bool operator!=(const accessor &Rhs) const { return !(*this == Rhs); } + +private: + void checkDeviceAccessorBufferSize(const size_t elemInBuffer) { + if (!IsHostBuf && elemInBuffer == 0) + throw cl::sycl::invalid_object_error( + "SYCL buffer size is zero. To create a device accessor, SYCL " + "buffer size must be greater than zero.", + PI_INVALID_VALUE); + } }; #if __cplusplus > 201402L diff --git a/sycl/test/basic_tests/accessor/accessor.cpp b/sycl/test/basic_tests/accessor/accessor.cpp index ebb99a0f7abbe..413ed9ddd0c13 100644 --- a/sycl/test/basic_tests/accessor/accessor.cpp +++ b/sycl/test/basic_tests/accessor/accessor.cpp @@ -540,4 +540,33 @@ int main() { return 1; } } + + // Accessor with buffer size 0. + { + try { + int data[10] = {0}; + { + sycl::buffer b{&data[0], 10}; + sycl::buffer b1{0}; + + sycl::queue queue; + queue.submit([&](sycl::handler &cgh) { + sycl::accessor + B(b, cgh); + auto B1 = b1.template get_access(cgh); + + cgh.single_task([=]() { + B[0] = 1; + }); + }); + } + assert(!"invalid device accessor buffer size exception wasn't caught"); + } catch (const sycl::invalid_object_error &e) { + assert(e.get_cl_code() == CL_INVALID_VALUE); + } catch (sycl::exception e) { + std::cout << "SYCL exception caught: " << e.what(); + return 1; + } + } }