Skip to content

Commit fd45980

Browse files
authored
[SYCL] Modifies accessor::ConcreteASPtrType to be const for readonly accessor (intel#9651)
* Modifies accessor::ConcreteASPtrType to be `const` for `readonly` accessor to fix failing case where copying accessor<const T>::MData does not compile when src type is `const` and dest is `non-const`. * Add test
1 parent 399442d commit fd45980

File tree

2 files changed

+37
-11
lines changed

2 files changed

+37
-11
lines changed

sycl/include/sycl/accessor.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1159,7 +1159,10 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
11591159
!IsConst || IsAccessReadOnly,
11601160
"A const qualified DataT is only allowed for a read-only accessor");
11611161

1162-
using ConcreteASPtrType = typename detail::DecoratedType<DataT, AS>::type *;
1162+
using ConcreteASPtrType = typename detail::DecoratedType<
1163+
typename std::conditional_t<IsAccessReadOnly && !IsConstantBuf,
1164+
const DataT, DataT>,
1165+
AS>::type *;
11631166

11641167
using RefType = detail::const_if_const_AS<AS, DataT> &;
11651168
using ConstRefType = const DataT &;

sycl/test-e2e/Basic/accessor/accessor.cpp

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,16 @@ template <typename Acc> struct Wrapper3 {
6262
Wrapper2<Acc> w2;
6363
};
6464

65-
void implicit_conversion(
66-
const sycl::accessor<const int, 1, sycl::access::mode::read> &acc,
67-
const sycl::accessor<int, 1, sycl::access::mode::read_write> &res_acc) {
65+
using ResAccT = sycl::accessor<int, 1, sycl::access::mode::read_write>;
66+
using AccT = sycl::accessor<int, 1, sycl::access::mode::read>;
67+
using AccCT = sycl::accessor<const int, 1, sycl::access::mode::read>;
68+
69+
void implicit_conversion(const AccCT &acc, const ResAccT &res_acc) {
70+
auto v = acc[0];
71+
res_acc[0] = v;
72+
}
73+
74+
void implicit_conversion(const AccT &acc, const ResAccT &res_acc) {
6875
auto v = acc[0];
6976
res_acc[0] = v;
7077
}
@@ -769,7 +776,6 @@ int main() {
769776
{
770777
sycl::queue q;
771778
try {
772-
using AccT = sycl::accessor<int, 1, sycl::access::mode::read_write>;
773779
AccT acc;
774780

775781
q.submit([&](sycl::handler &cgh) { cgh.require(acc); });
@@ -1313,9 +1319,6 @@ int main() {
13131319

13141320
// accessor<T> to accessor<const T> implicit conversion.
13151321
{
1316-
using ResAccT = sycl::accessor<int, 1, sycl::access::mode::read_write>;
1317-
using AccT = sycl::accessor<int, 1, sycl::access::mode::read>;
1318-
13191322
int data = 123;
13201323
int result = 0;
13211324
{
@@ -1333,11 +1336,31 @@ int main() {
13331336
assert(result == 123 && "Expected value not seen.");
13341337
}
13351338

1336-
// accessor swap
13371339
{
1338-
using ResAccT = sycl::accessor<int, 1, sycl::access::mode::read_write>;
1339-
using AccT = sycl::accessor<int, 1, sycl::access::mode::read>;
1340+
const int data = 123;
1341+
int result = 0;
1342+
1343+
// accessor<const T, read_only> to accessor<T, read_only> implicit conversion.
1344+
{
1345+
sycl::buffer<const int, 1> data_buf(&data, 1);
1346+
sycl::buffer<int, 1> res_buf(&result, 1);
1347+
1348+
sycl::queue queue;
1349+
queue
1350+
.submit([&](sycl::handler &cgh) {
1351+
ResAccT res_acc = res_buf.get_access(cgh);
1352+
AccCT acc(data_buf, cgh);
1353+
cgh.parallel_for_work_group(sycl::range(1), [=](sycl::group<1>) {
1354+
implicit_conversion(acc, res_acc);
1355+
});
1356+
})
1357+
.wait_and_throw();
1358+
}
1359+
assert(result == 123 && "Expected value not seen.");
1360+
}
13401361

1362+
// accessor swap
1363+
{
13411364
int data[2] = {2, 100};
13421365
int data2[2] = {23, 4};
13431366
int results[2] = {0, 0};

0 commit comments

Comments
 (0)