Skip to content

Commit 227614c

Browse files
[SYCL] Adjust accessor::value_type in accordance with the spec (#7096)
`value_type` should be defined as `const DataT` for read-only accessors. This also makes `accessor::iterator` of a read-only accessor non-writeable as it should be in accordance with the spec.
1 parent 7a86aac commit 227614c

File tree

2 files changed

+64
-3
lines changed

2 files changed

+64
-3
lines changed

sycl/include/sycl/accessor.hpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,13 +1205,17 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
12051205
friend class sycl::ext::intel::esimd::detail::AccessorPrivateProxy;
12061206

12071207
public:
1208-
using value_type = DataT;
1208+
// 4.7.6.9.1. Interface for buffer command accessors
1209+
// value_type is defined as const DataT for read_only accessors, DataT
1210+
// otherwise
1211+
using value_type = typename std::conditional<AccessMode == access_mode::read,
1212+
const DataT, DataT>::type;
12091213
using reference = DataT &;
12101214
using const_reference = const DataT &;
12111215

1212-
using iterator = typename detail::accessor_iterator<DataT, Dimensions>;
1216+
using iterator = typename detail::accessor_iterator<value_type, Dimensions>;
12131217
using const_iterator =
1214-
typename detail::accessor_iterator<const DataT, Dimensions>;
1218+
typename detail::accessor_iterator<const value_type, Dimensions>;
12151219
using difference_type =
12161220
typename std::iterator_traits<iterator>::difference_type;
12171221

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// RUN: %clangxx -fsycl -c %s
2+
//
3+
// Purpose of this test is to check that [accessor|host_accessor]::iterator and
4+
// ::const_iterator are aliased to the correct type.
5+
// FIXME: extend this test to also check ::reverse_iterator and
6+
// ::const_reverse_iterator
7+
#include <sycl/sycl.hpp>
8+
9+
#include <type_traits>
10+
11+
template <typename DataT, int Dimensions, sycl::access_mode AccessMode,
12+
sycl::target AccessTarget = sycl::target::device>
13+
void check_accessor() {
14+
using AccessorT =
15+
typename sycl::accessor<DataT, Dimensions, AccessMode, AccessTarget>;
16+
static_assert(std::is_same_v<sycl::detail::accessor_iterator<
17+
typename AccessorT::value_type, Dimensions>,
18+
typename AccessorT::iterator>);
19+
20+
static_assert(
21+
std::is_same_v<sycl::detail::accessor_iterator<
22+
const typename AccessorT::value_type, Dimensions>,
23+
typename AccessorT::const_iterator>);
24+
}
25+
26+
template <typename DataT, int Dimensions, sycl::access_mode AccessMode>
27+
void check_host_accessor() {
28+
using AccessorT = typename sycl::host_accessor<DataT, Dimensions, AccessMode>;
29+
static_assert(std::is_same_v<sycl::detail::accessor_iterator<
30+
typename AccessorT::value_type, Dimensions>,
31+
typename AccessorT::iterator>);
32+
33+
static_assert(
34+
std::is_same_v<sycl::detail::accessor_iterator<
35+
const typename AccessorT::value_type, Dimensions>,
36+
typename AccessorT::const_iterator>);
37+
}
38+
39+
struct user_defined_t {
40+
char c;
41+
float f;
42+
double d;
43+
sycl::vec<int, 3> v3;
44+
};
45+
46+
int main() {
47+
48+
check_accessor<int, 1, sycl::access_mode::read>();
49+
check_accessor<float, 2, sycl::access_mode::write>();
50+
check_accessor<user_defined_t, 3, sycl::access_mode::read_write>();
51+
52+
check_host_accessor<user_defined_t, 1, sycl::access_mode::read>();
53+
check_host_accessor<int, 2, sycl::access_mode::write>();
54+
check_host_accessor<float, 3, sycl::access_mode::read_write>();
55+
56+
return 0;
57+
}

0 commit comments

Comments
 (0)