@@ -314,6 +314,7 @@ class accessor_common {
314
314
AccessMode == access::mode::discard_read_write;
315
315
316
316
constexpr static bool IsAccessReadOnly = AccessMode == access::mode::read;
317
+ static constexpr bool IsConst = std::is_const<DataT>::value;
317
318
318
319
constexpr static bool IsAccessReadWrite =
319
320
AccessMode == access::mode::read_write;
@@ -371,6 +372,13 @@ class accessor_common {
371
372
};
372
373
};
373
374
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
+
374
382
template <typename MayBeTag1, typename MayBeTag2>
375
383
constexpr access::mode deduceAccessMode () {
376
384
// property_list = {} is not properly detected by deduction guide,
@@ -1020,10 +1028,15 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1020
1028
static constexpr bool IsGlobalBuf = AccessorCommonT::IsGlobalBuf;
1021
1029
static constexpr bool IsHostBuf = AccessorCommonT::IsHostBuf;
1022
1030
static constexpr bool IsPlaceH = AccessorCommonT::IsPlaceH;
1031
+ static constexpr bool IsConst = AccessorCommonT::IsConst;
1023
1032
template <int Dims>
1024
1033
using AccessorSubscript =
1025
1034
typename AccessorCommonT::template AccessorSubscript<Dims>;
1026
1035
1036
+ static_assert (
1037
+ !IsConst || IsAccessReadOnly,
1038
+ " A const qualified DataT is only allowed for a read-only accessor" );
1039
+
1027
1040
using ConcreteASPtrType = typename detail::DecoratedType<DataT, AS>::type *;
1028
1041
1029
1042
using RefType = detail::const_if_const_AS<AS, DataT> &;
@@ -2392,7 +2405,13 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
2392
2405
access::target::local, IsPlaceholder>;
2393
2406
2394
2407
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
+
2396
2415
template <int Dims>
2397
2416
using AccessorSubscript =
2398
2417
typename AccessorCommonT::template AccessorSubscript<
@@ -2485,7 +2504,8 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
2485
2504
local_accessor_base (handler &, const detail::code_location CodeLoc =
2486
2505
detail::code_location::current ())
2487
2506
#ifdef __SYCL_DEVICE_ONLY__
2488
- : impl(range<AdjustedDim>{1 }){}
2507
+ : impl(range<AdjustedDim>{1 }) {
2508
+ }
2489
2509
#else
2490
2510
: LocalAccessorBaseHost(range<3 >{1 , 1 , 1 }, AdjustedDim, sizeof (DataT)) {
2491
2511
detail::constructorNotification (nullptr , LocalAccessorBaseHost::impl.get (),
@@ -2494,11 +2514,10 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
2494
2514
}
2495
2515
#endif
2496
2516
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())
2502
2521
#ifdef __SYCL_DEVICE_ONLY__
2503
2522
: impl(range<AdjustedDim>{1 }) {
2504
2523
(void )propList;
@@ -2517,7 +2536,8 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
2517
2536
range<Dimensions> AllocationSize, handler &,
2518
2537
const detail::code_location CodeLoc = detail::code_location::current())
2519
2538
#ifdef __SYCL_DEVICE_ONLY__
2520
- : impl(AllocationSize){}
2539
+ : impl(AllocationSize) {
2540
+ }
2521
2541
#else
2522
2542
: LocalAccessorBaseHost(detail::convertToArrayOfN<3 , 1 >(AllocationSize),
2523
2543
AdjustedDim, sizeof (DataT)) {
@@ -2527,12 +2547,11 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
2527
2547
}
2528
2548
#endif
2529
2549
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())
2536
2555
#ifdef __SYCL_DEVICE_ONLY__
2537
2556
: impl(AllocationSize) {
2538
2557
(void )propList;
@@ -2634,6 +2653,10 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS accessor<
2634
2653
using local_acc =
2635
2654
local_accessor_base<DataT, Dimensions, AccessMode, IsPlaceholder>;
2636
2655
2656
+ static_assert (
2657
+ !local_acc::IsConst || local_acc::IsAccessReadOnly,
2658
+ " A const qualified DataT is only allowed for a read-only accessor" );
2659
+
2637
2660
// Use base classes constructors
2638
2661
using local_acc::local_acc;
2639
2662
@@ -2663,14 +2686,20 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS accessor<
2663
2686
2664
2687
template <typename DataT, int Dimensions = 1 >
2665
2688
class __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>(),
2667
2691
access::placeholder::false_t>,
2668
2692
public detail::OwnerLessBase<local_accessor<DataT, Dimensions>> {
2669
2693
2670
2694
using local_acc =
2671
- local_accessor_base<DataT, Dimensions, access::mode::read_write,
2695
+ local_accessor_base<DataT, Dimensions,
2696
+ detail::accessModeFromConstness<DataT>(),
2672
2697
access::placeholder::false_t >;
2673
2698
2699
+ static_assert (
2700
+ !local_acc::IsConst || local_acc::IsAccessReadOnly,
2701
+ " A const qualified DataT is only allowed for a read-only accessor" );
2702
+
2674
2703
// Use base classes constructors
2675
2704
using local_acc::local_acc;
2676
2705
0 commit comments