@@ -314,6 +314,7 @@ class accessor_common {
314314 AccessMode == access::mode::discard_read_write;
315315
316316 constexpr static bool IsAccessReadOnly = AccessMode == access::mode::read;
317+ static constexpr bool IsConst = std::is_const<DataT>::value;
317318
318319 constexpr static bool IsAccessReadWrite =
319320 AccessMode == access::mode::read_write;
@@ -371,6 +372,13 @@ class accessor_common {
371372 };
372373};
373374
375+ template <typename DataT> constexpr access::mode accessModeFromConstness () {
376+ if constexpr (std::is_const<DataT>::value)
377+ return access::mode::read;
378+ else
379+ return access::mode::read_write;
380+ }
381+
374382template <typename MayBeTag1, typename MayBeTag2>
375383constexpr access::mode deduceAccessMode () {
376384 // property_list = {} is not properly detected by deduction guide,
@@ -1020,10 +1028,15 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
10201028 static constexpr bool IsGlobalBuf = AccessorCommonT::IsGlobalBuf;
10211029 static constexpr bool IsHostBuf = AccessorCommonT::IsHostBuf;
10221030 static constexpr bool IsPlaceH = AccessorCommonT::IsPlaceH;
1031+ static constexpr bool IsConst = AccessorCommonT::IsConst;
10231032 template <int Dims>
10241033 using AccessorSubscript =
10251034 typename AccessorCommonT::template AccessorSubscript<Dims>;
10261035
1036+ static_assert (
1037+ !IsConst || IsAccessReadOnly,
1038+ " A const qualified DataT is only allowed for a read-only accessor" );
1039+
10271040 using ConcreteASPtrType = typename detail::DecoratedType<DataT, AS>::type *;
10281041
10291042 using RefType = detail::const_if_const_AS<AS, DataT> &;
@@ -2392,7 +2405,13 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
23922405 access::target::local, IsPlaceholder>;
23932406
23942407 using AccessorCommonT::AS;
2395- using AccessorCommonT::IsAccessAnyWrite;
2408+
2409+ // Cannot do "using AccessorCommonT::Flag" as it doesn't work with g++ as host
2410+ // compiler, for some reason.
2411+ static constexpr bool IsAccessAnyWrite = AccessorCommonT::IsAccessAnyWrite;
2412+ static constexpr bool IsAccessReadOnly = AccessorCommonT::IsAccessReadOnly;
2413+ static constexpr bool IsConst = AccessorCommonT::IsConst;
2414+
23962415 template <int Dims>
23972416 using AccessorSubscript =
23982417 typename AccessorCommonT::template AccessorSubscript<
@@ -2485,7 +2504,8 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
24852504 local_accessor_base (handler &, const detail::code_location CodeLoc =
24862505 detail::code_location::current ())
24872506#ifdef __SYCL_DEVICE_ONLY__
2488- : impl(range<AdjustedDim>{1 }){}
2507+ : impl(range<AdjustedDim>{1 }) {
2508+ }
24892509#else
24902510 : LocalAccessorBaseHost(range<3 >{1 , 1 , 1 }, AdjustedDim, sizeof (DataT)) {
24912511 detail::constructorNotification (nullptr , LocalAccessorBaseHost::impl.get (),
@@ -2494,11 +2514,10 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
24942514 }
24952515#endif
24962516
2497- template <int Dims = Dimensions,
2498- typename = detail::enable_if_t <Dims == 0 >>
2499- local_accessor_base (handler &, const property_list &propList,
2500- const detail::code_location CodeLoc =
2501- detail::code_location::current ())
2517+ template <int Dims = Dimensions, typename = detail::enable_if_t <Dims == 0 >>
2518+ local_accessor_base (
2519+ handler &, const property_list &propList,
2520+ const detail::code_location CodeLoc = detail::code_location::current())
25022521#ifdef __SYCL_DEVICE_ONLY__
25032522 : impl(range<AdjustedDim>{1 }) {
25042523 (void )propList;
@@ -2517,7 +2536,8 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
25172536 range<Dimensions> AllocationSize, handler &,
25182537 const detail::code_location CodeLoc = detail::code_location::current())
25192538#ifdef __SYCL_DEVICE_ONLY__
2520- : impl(AllocationSize){}
2539+ : impl(AllocationSize) {
2540+ }
25212541#else
25222542 : LocalAccessorBaseHost(detail::convertToArrayOfN<3 , 1 >(AllocationSize),
25232543 AdjustedDim, sizeof (DataT)) {
@@ -2527,12 +2547,11 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
25272547 }
25282548#endif
25292549
2530- template <int Dims = Dimensions,
2531- typename = detail::enable_if_t <(Dims > 0 )>>
2532- local_accessor_base (range<Dimensions> AllocationSize, handler &,
2533- const property_list &propList,
2534- const detail::code_location CodeLoc =
2535- detail::code_location::current ())
2550+ template <int Dims = Dimensions, typename = detail::enable_if_t <(Dims > 0 )>>
2551+ local_accessor_base (
2552+ range<Dimensions> AllocationSize, handler &,
2553+ const property_list &propList,
2554+ const detail::code_location CodeLoc = detail::code_location::current())
25362555#ifdef __SYCL_DEVICE_ONLY__
25372556 : impl(AllocationSize) {
25382557 (void )propList;
@@ -2634,6 +2653,10 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS accessor<
26342653 using local_acc =
26352654 local_accessor_base<DataT, Dimensions, AccessMode, IsPlaceholder>;
26362655
2656+ static_assert (
2657+ !local_acc::IsConst || local_acc::IsAccessReadOnly,
2658+ " A const qualified DataT is only allowed for a read-only accessor" );
2659+
26372660 // Use base classes constructors
26382661 using local_acc::local_acc;
26392662
@@ -2663,14 +2686,20 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS accessor<
26632686
26642687template <typename DataT, int Dimensions = 1 >
26652688class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE (local_accessor) local_accessor
2666- : public local_accessor_base<DataT, Dimensions, access::mode::read_write,
2689+ : public local_accessor_base<DataT, Dimensions,
2690+ detail::accessModeFromConstness<DataT>(),
26672691 access::placeholder::false_t>,
26682692 public detail::OwnerLessBase<local_accessor<DataT, Dimensions>> {
26692693
26702694 using local_acc =
2671- local_accessor_base<DataT, Dimensions, access::mode::read_write,
2695+ local_accessor_base<DataT, Dimensions,
2696+ detail::accessModeFromConstness<DataT>(),
26722697 access::placeholder::false_t >;
26732698
2699+ static_assert (
2700+ !local_acc::IsConst || local_acc::IsAccessReadOnly,
2701+ " A const qualified DataT is only allowed for a read-only accessor" );
2702+
26742703 // Use base classes constructors
26752704 using local_acc::local_acc;
26762705
0 commit comments