Skip to content

Commit 8a9c8fb

Browse files
againullromanovvlad
authored andcommitted
[SYCL] Fix SFINAE for accessor class to work with MSVC
It looks like in the following case: template<int T> some_class_method(typename std::enable_if<[some type of the argument], [some condition that doesn't depend on T] && T != 1>::type Arg) { ... } MSVC emits the error: 'type': is not a member of of any direct or indirect base class of 'std::enable_if<false,...' This could be work arounded by changing the order of && arguments. Probably the reason is that of first argument of && is false then we don't even take into account the second argument. Signed-off-by: Artur Gainullin <[email protected]>
1 parent 4390733 commit 8a9c8fb

File tree

1 file changed

+45
-45
lines changed

1 file changed

+45
-45
lines changed

sycl/include/CL/sycl/accessor.hpp

Lines changed: 45 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -212,21 +212,22 @@ class accessor_common {
212212
MIDs[0] = Index;
213213
}
214214

215-
template <int CurDims = SubDims, typename = enable_if_t<(CurDims > 1)>>
216-
AccessorSubscript<CurDims - 1> operator[](size_t Index) {
215+
template <int CurDims = SubDims>
216+
typename std::enable_if<(CurDims > 1), AccessorSubscript<CurDims - 1>>::type
217+
operator[](size_t Index) {
217218
MIDs[Dims - CurDims] = Index;
218219
return AccessorSubscript<CurDims - 1>(MAccessor, MIDs);
219220
}
220221

221222
template <int CurDims = SubDims,
222-
typename = enable_if_t<IsAccessAnyWrite && CurDims == 1>>
223+
typename = enable_if_t<CurDims == 1 && IsAccessAnyWrite>>
223224
RefType operator[](size_t Index) const {
224225
MIDs[Dims - CurDims] = Index;
225226
return MAccessor[MIDs];
226227
}
227228

228229
template <int CurDims = SubDims,
229-
typename = enable_if_t<IsAccessReadOnly && CurDims == 1>>
230+
typename = enable_if_t<CurDims == 1 && IsAccessReadOnly>>
230231
DataT operator[](size_t Index) const {
231232
MIDs[Dims - SubDims] = Index;
232233
return MAccessor[MIDs];
@@ -336,9 +337,10 @@ class accessor :
336337
using const_reference = const DataT &;
337338

338339
template <int Dims = Dimensions>
339-
accessor(enable_if_t<((!IsPlaceH && IsHostBuf) ||
340-
(IsPlaceH && (IsGlobalBuf || IsConstantBuf))) &&
341-
Dims == 0, buffer<DataT, 1> > &BufferRef)
340+
accessor(
341+
enable_if_t<Dims == 0 && ((!IsPlaceH && IsHostBuf) ||
342+
(IsPlaceH && (IsGlobalBuf || IsConstantBuf))),
343+
buffer<DataT, 1>> &BufferRef)
342344
#ifdef __SYCL_DEVICE_ONLY__
343345
: impl(id<AdjustedDim>(), BufferRef.get_range(), BufferRef.MemRange) {
344346
#else
@@ -358,8 +360,8 @@ class accessor :
358360
template <int Dims = Dimensions>
359361
accessor(
360362
buffer<DataT, 1> &BufferRef,
361-
enable_if_t<(!IsPlaceH && (IsGlobalBuf || IsConstantBuf)) && Dims == 0,
362-
handler> &CommandGroupHandler)
363+
enable_if_t<Dims == 0 && (!IsPlaceH && (IsGlobalBuf || IsConstantBuf)),
364+
handler> &CommandGroupHandler)
363365
#ifdef __SYCL_DEVICE_ONLY__
364366
: impl(id<AdjustedDim>(), BufferRef.get_range(), BufferRef.MemRange) {
365367
}
@@ -374,11 +376,10 @@ class accessor :
374376
}
375377
#endif
376378

377-
template <
378-
int Dims = Dimensions,
379-
typename = enable_if_t<((!IsPlaceH && IsHostBuf) ||
380-
(IsPlaceH && (IsGlobalBuf || IsConstantBuf))) &&
381-
(Dims > 0)>>
379+
template <int Dims = Dimensions,
380+
typename = enable_if_t<
381+
(Dims > 0) && ((!IsPlaceH && IsHostBuf) ||
382+
(IsPlaceH && (IsGlobalBuf || IsConstantBuf)))>>
382383
accessor(buffer<DataT, Dimensions> &BufferRef)
383384
#ifdef __SYCL_DEVICE_ONLY__
384385
: impl(id<Dimensions>(), BufferRef.get_range(), BufferRef.MemRange) {
@@ -399,7 +400,7 @@ class accessor :
399400

400401
template <int Dims = Dimensions,
401402
typename = enable_if_t<
402-
(!IsPlaceH && (IsGlobalBuf || IsConstantBuf)) && (Dims > 0)>>
403+
(Dims > 0) && (!IsPlaceH && (IsGlobalBuf || IsConstantBuf))>>
403404
accessor(buffer<DataT, Dimensions> &BufferRef, handler &CommandGroupHandler)
404405
#ifdef __SYCL_DEVICE_ONLY__
405406
: impl(id<AdjustedDim>(), BufferRef.get_range(), BufferRef.MemRange) {
@@ -415,22 +416,21 @@ class accessor :
415416
}
416417
#endif
417418

418-
template <
419-
int Dims = Dimensions,
420-
typename = enable_if_t<((!IsPlaceH && IsHostBuf) ||
421-
(IsPlaceH && (IsGlobalBuf || IsConstantBuf))) &&
422-
(Dims > 0)>>
419+
template <int Dims = Dimensions,
420+
typename = enable_if_t<
421+
(Dims > 0) && ((!IsPlaceH && IsHostBuf) ||
422+
(IsPlaceH && (IsGlobalBuf || IsConstantBuf)))>>
423423
accessor(buffer<DataT, Dimensions> &BufferRef, range<Dimensions> AccessRange,
424424
id<Dimensions> AccessOffset = {})
425425
#ifdef __SYCL_DEVICE_ONLY__
426426
: impl(AccessOffset, AccessRange, BufferRef.MemRange) {
427427
}
428428
#else
429429
: AccessorBaseHost(detail::convertToArrayOfN<3, 0>(AccessOffset),
430-
detail::convertToArrayOfN<3, 1>(AccessRange),
431-
detail::convertToArrayOfN<3, 1>(BufferRef.MemRange),
432-
AccessMode, detail::getSyclObjImpl(BufferRef).get(),
433-
Dimensions, sizeof(DataT)) {
430+
detail::convertToArrayOfN<3, 1>(AccessRange),
431+
detail::convertToArrayOfN<3, 1>(BufferRef.MemRange),
432+
AccessMode, detail::getSyclObjImpl(BufferRef).get(),
433+
Dimensions, sizeof(DataT)) {
434434
detail::EventImplPtr Event =
435435
detail::Scheduler::getInstance().addHostAccessor(
436436
AccessorBaseHost::impl.get());
@@ -440,18 +440,18 @@ class accessor :
440440

441441
template <int Dims = Dimensions,
442442
typename = enable_if_t<
443-
(!IsPlaceH && (IsGlobalBuf || IsConstantBuf)) && (Dims > 0)>>
443+
(Dims > 0) && (!IsPlaceH && (IsGlobalBuf || IsConstantBuf))>>
444444
accessor(buffer<DataT, Dimensions> &BufferRef, handler &CommandGroupHandler,
445445
range<Dimensions> AccessRange, id<Dimensions> AccessOffset = {})
446446
#ifdef __SYCL_DEVICE_ONLY__
447447
: impl(AccessOffset, AccessRange, BufferRef.MemRange) {
448448
}
449449
#else
450450
: AccessorBaseHost(detail::convertToArrayOfN<3, 0>(AccessOffset),
451-
detail::convertToArrayOfN<3, 1>(AccessRange),
452-
detail::convertToArrayOfN<3, 1>(BufferRef.MemRange),
453-
AccessMode, detail::getSyclObjImpl(BufferRef).get(),
454-
Dimensions, sizeof(DataT)) {
451+
detail::convertToArrayOfN<3, 1>(AccessRange),
452+
detail::convertToArrayOfN<3, 1>(BufferRef.MemRange),
453+
AccessMode, detail::getSyclObjImpl(BufferRef).get(),
454+
Dimensions, sizeof(DataT)) {
455455
CommandGroupHandler.associateWithHandler(*this);
456456
}
457457
#endif
@@ -473,58 +473,58 @@ class accessor :
473473
}
474474

475475
template <int Dims = Dimensions,
476-
typename = enable_if_t<IsAccessAnyWrite && Dims == 0>>
476+
typename = enable_if_t<Dims == 0 && IsAccessAnyWrite>>
477477
operator RefType() const {
478478
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
479479
return *(getQualifiedPtr() + LinearIndex);
480480
}
481481

482482
template <int Dims = Dimensions,
483-
typename = enable_if_t<IsAccessAnyWrite && (Dims > 0)>>
483+
typename = enable_if_t<(Dims > 0) && IsAccessAnyWrite>>
484484
RefType operator[](id<Dimensions> Index) const {
485485
const size_t LinearIndex = getLinearIndex(Index);
486486
return getQualifiedPtr()[LinearIndex];
487487
}
488488

489489
template <int Dims = Dimensions,
490-
typename = enable_if_t<IsAccessAnyWrite && Dims == 1>>
490+
typename = enable_if_t<Dims == 1 && IsAccessAnyWrite>>
491491
RefType operator[](size_t Index) const {
492492
const size_t LinearIndex = getLinearIndex(id<Dimensions>(Index));
493493
return getQualifiedPtr()[LinearIndex];
494494
}
495495

496496
template <int Dims = Dimensions,
497-
typename = enable_if_t<IsAccessReadOnly && Dims == 0>>
497+
typename = enable_if_t<Dims == 0 && IsAccessReadOnly>>
498498
operator DataT() const {
499499
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
500500
return *(getQualifiedPtr() + LinearIndex);
501501
}
502502

503503
template <int Dims = Dimensions,
504-
typename = enable_if_t<IsAccessReadOnly && (Dims > 0)>>
504+
typename = enable_if_t<(Dims > 0) && IsAccessReadOnly>>
505505
DataT operator[](id<Dimensions> Index) const {
506506
const size_t LinearIndex = getLinearIndex(Index);
507507
return getQualifiedPtr()[LinearIndex];
508508
}
509509

510510
template <int Dims = Dimensions,
511-
typename = enable_if_t<IsAccessReadOnly && Dims == 1>>
511+
typename = enable_if_t<Dims == 1 && IsAccessReadOnly>>
512512
DataT operator[](size_t Index) const {
513513
const size_t LinearIndex = getLinearIndex(id<Dimensions>(Index));
514514
return getQualifiedPtr()[LinearIndex];
515515
}
516516

517517
template <int Dims = Dimensions>
518-
operator typename std::enable_if<AccessMode == access::mode::atomic &&
519-
Dims == 0,
518+
operator typename std::enable_if<Dims == 0 &&
519+
AccessMode == access::mode::atomic,
520520
atomic<DataT, AS>>::type() const {
521521
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
522522
return atomic<DataT, AS>(
523523
multi_ptr<DataT, AS>(getQualifiedPtr() + LinearIndex));
524524
}
525525

526526
template <int Dims = Dimensions>
527-
typename std::enable_if<AccessMode == access::mode::atomic && (Dims > 0),
527+
typename std::enable_if<(Dims > 0) && AccessMode == access::mode::atomic,
528528
atomic<DataT, AS>>::type
529529
operator[](id<Dimensions> Index) const {
530530
const size_t LinearIndex = getLinearIndex(Index);
@@ -533,7 +533,7 @@ class accessor :
533533
}
534534

535535
template <int Dims = Dimensions>
536-
typename enable_if_t<AccessMode == access::mode::atomic && Dims == 1,
536+
typename enable_if_t<Dims == 1 && AccessMode == access::mode::atomic,
537537
atomic<DataT, AS>>::type
538538
operator[](size_t Index) const {
539539
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>(Index));
@@ -672,34 +672,34 @@ class accessor<DataT, Dimensions, AccessMode, access::target::local,
672672
size_t get_count() const { return getSize().size(); }
673673

674674
template <int Dims = Dimensions,
675-
typename = enable_if_t<IsAccessAnyWrite && Dims == 0>>
675+
typename = enable_if_t<Dims == 0 && IsAccessAnyWrite>>
676676
operator RefType() const {
677677
return *getQualifiedPtr();
678678
}
679679

680680
template <int Dims = Dimensions,
681-
typename = enable_if_t<IsAccessAnyWrite && (Dims > 0)>>
681+
typename = enable_if_t<(Dims > 0) && IsAccessAnyWrite>>
682682
RefType operator[](id<Dimensions> Index) const {
683683
const size_t LinearIndex = getLinearIndex(Index);
684684
return getQualifiedPtr()[LinearIndex];
685685
}
686686

687687
template <int Dims = Dimensions,
688-
typename = enable_if_t<IsAccessAnyWrite && Dims == 1>>
688+
typename = enable_if_t<Dims == 1 && IsAccessAnyWrite>>
689689
RefType operator[](size_t Index) const {
690690
return getQualifiedPtr()[Index];
691691
}
692692

693693
template <
694694
int Dims = Dimensions,
695-
typename = enable_if_t<AccessMode == access::mode::atomic && Dims == 0>>
695+
typename = enable_if_t<Dims == 0 && AccessMode == access::mode::atomic>>
696696
operator atomic<DataT, AS>() const {
697697
return atomic<DataT, AS>(multi_ptr<DataT, AS>(getQualifiedPtr()));
698698
}
699699

700700
template <
701701
int Dims = Dimensions,
702-
typename = enable_if_t<AccessMode == access::mode::atomic && (Dims > 0)>>
702+
typename = enable_if_t<(Dims > 0) && AccessMode == access::mode::atomic>>
703703
atomic<DataT, AS> operator[](id<Dimensions> Index) const {
704704
const size_t LinearIndex = getLinearIndex(Index);
705705
return atomic<DataT, AS>(
@@ -708,7 +708,7 @@ class accessor<DataT, Dimensions, AccessMode, access::target::local,
708708

709709
template <
710710
int Dims = Dimensions,
711-
typename = enable_if_t<AccessMode == access::mode::atomic && Dims == 1>>
711+
typename = enable_if_t<Dims == 1 && AccessMode == access::mode::atomic>>
712712
atomic<DataT, AS> operator[](size_t Index) const {
713713
return atomic<DataT, AS>(multi_ptr<DataT, AS>(getQualifiedPtr() + Index));
714714
}

0 commit comments

Comments
 (0)