@@ -723,6 +723,19 @@ class __SYCL_EXPORT handler {
723
723
return isConstOrGlobal (AccessTarget) || isImageOrImageArray (AccessTarget);
724
724
}
725
725
726
+ constexpr static bool isValidModeForSourceAccessor (access::mode AccessMode) {
727
+ return AccessMode == access::mode::read ||
728
+ AccessMode == access::mode::read_write;
729
+ }
730
+
731
+ constexpr static bool
732
+ isValidModeForDestinationAccessor (access::mode AccessMode) {
733
+ return AccessMode == access::mode::write ||
734
+ AccessMode == access::mode::read_write ||
735
+ AccessMode == access::mode::discard_write ||
736
+ AccessMode == access::mode::discard_read_write;
737
+ }
738
+
726
739
// / Defines and invokes a SYCL kernel function for the specified range.
727
740
// /
728
741
// / The SYCL kernel function is defined as a lambda function or a named
@@ -1674,6 +1687,8 @@ class __SYCL_EXPORT handler {
1674
1687
throwIfActionIsCreated ();
1675
1688
static_assert (isValidTargetForExplicitOp (AccessTarget),
1676
1689
" Invalid accessor target for the copy method." );
1690
+ static_assert (isValidModeForSourceAccessor (AccessMode),
1691
+ " Invalid accessor mode for the copy method." );
1677
1692
// Make sure data shared_ptr points to is not released until we finish
1678
1693
// work with it.
1679
1694
MSharedPtrStorage.push_back (Dst);
@@ -1697,6 +1712,8 @@ class __SYCL_EXPORT handler {
1697
1712
throwIfActionIsCreated ();
1698
1713
static_assert (isValidTargetForExplicitOp (AccessTarget),
1699
1714
" Invalid accessor target for the copy method." );
1715
+ static_assert (isValidModeForDestinationAccessor (AccessMode),
1716
+ " Invalid accessor mode for the copy method." );
1700
1717
// Make sure data shared_ptr points to is not released until we finish
1701
1718
// work with it.
1702
1719
MSharedPtrStorage.push_back (Src);
@@ -1719,6 +1736,8 @@ class __SYCL_EXPORT handler {
1719
1736
throwIfActionIsCreated ();
1720
1737
static_assert (isValidTargetForExplicitOp (AccessTarget),
1721
1738
" Invalid accessor target for the copy method." );
1739
+ static_assert (isValidModeForSourceAccessor (AccessMode),
1740
+ " Invalid accessor mode for the copy method." );
1722
1741
#ifndef __SYCL_DEVICE_ONLY__
1723
1742
if (MIsHost) {
1724
1743
// TODO: Temporary implementation for host. Should be handled by memory
@@ -1756,6 +1775,8 @@ class __SYCL_EXPORT handler {
1756
1775
throwIfActionIsCreated ();
1757
1776
static_assert (isValidTargetForExplicitOp (AccessTarget),
1758
1777
" Invalid accessor target for the copy method." );
1778
+ static_assert (isValidModeForDestinationAccessor (AccessMode),
1779
+ " Invalid accessor mode for the copy method." );
1759
1780
#ifndef __SYCL_DEVICE_ONLY__
1760
1781
if (MIsHost) {
1761
1782
// TODO: Temporary implementation for host. Should be handled by memory
@@ -1801,6 +1822,10 @@ class __SYCL_EXPORT handler {
1801
1822
" Invalid source accessor target for the copy method." );
1802
1823
static_assert (isValidTargetForExplicitOp (AccessTarget_Dst),
1803
1824
" Invalid destination accessor target for the copy method." );
1825
+ static_assert (isValidModeForSourceAccessor (AccessMode_Src),
1826
+ " Invalid source accessor mode for the copy method." );
1827
+ static_assert (isValidModeForDestinationAccessor (AccessMode_Dst),
1828
+ " Invalid destination accessor mode for the copy method." );
1804
1829
assert (Dst.get_size () >= Src.get_size () &&
1805
1830
" The destination accessor does not fit the copied memory." );
1806
1831
if (copyAccToAccHelper (Src, Dst))
0 commit comments