@@ -276,6 +276,13 @@ template <> struct IsCxPropertyList<ext::oneapi::accessor_property_list<>> {
276
276
constexpr static bool value = false ;
277
277
};
278
278
279
+ // Zero-dimensional accessors references at-most a single element, so the range
280
+ // is either 0 if the associated buffer is empty or 1 otherwise.
281
+ template <typename BufferT>
282
+ sycl::range<1 > GetZeroDimAccessRange (BufferT Buffer) {
283
+ return std::min (Buffer.size (), size_t {1 });
284
+ }
285
+
279
286
__SYCL_EXPORT device getDeviceFromHandler (handler &CommandGroupHandlerRef);
280
287
281
288
template <typename DataT, int Dimensions, access::mode AccessMode,
@@ -1512,11 +1519,14 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1512
1519
const property_list &PropertyList = {},
1513
1520
const detail::code_location CodeLoc = detail::code_location::current ())
1514
1521
#ifdef __SYCL_DEVICE_ONLY__
1515
- : impl (id<AdjustedDim>(), range<1 >{1 }, BufferRef.get_range ()) {
1522
+ : impl (id<AdjustedDim>(), detail::GetZeroDimAccessRange (BufferRef),
1523
+ BufferRef.get_range ()) {
1516
1524
(void )PropertyList;
1517
1525
#else
1518
1526
: AccessorBaseHost (
1519
- /* Offset=*/ {0 , 0 , 0 }, detail::convertToArrayOfN<3 , 1 >(range<1 >{1 }),
1527
+ /* Offset=*/ {0 , 0 , 0 },
1528
+ detail::convertToArrayOfN<3 , 1 >(
1529
+ detail::GetZeroDimAccessRange (BufferRef)),
1520
1530
detail::convertToArrayOfN<3 , 1 >(BufferRef.get_range ()),
1521
1531
getAdjustedMode (PropertyList),
1522
1532
detail::getSyclObjImpl (BufferRef).get (), AdjustedDim, sizeof (DataT),
@@ -1548,11 +1558,14 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1548
1558
{},
1549
1559
const detail::code_location CodeLoc = detail::code_location::current ())
1550
1560
#ifdef __SYCL_DEVICE_ONLY__
1551
- : impl (id<AdjustedDim>(), range<1 >{1 }, BufferRef.get_range ()) {
1561
+ : impl (id<AdjustedDim>(), detail::GetZeroDimAccessRange (BufferRef),
1562
+ BufferRef.get_range ()) {
1552
1563
(void )PropertyList;
1553
1564
#else
1554
1565
: AccessorBaseHost (
1555
- /* Offset=*/ {0 , 0 , 0 }, detail::convertToArrayOfN<3 , 1 >(range<1 >{1 }),
1566
+ /* Offset=*/ {0 , 0 , 0 },
1567
+ detail::convertToArrayOfN<3 , 1 >(
1568
+ detail::GetZeroDimAccessRange (BufferRef)),
1556
1569
detail::convertToArrayOfN<3 , 1 >(BufferRef.get_range ()),
1557
1570
getAdjustedMode (PropertyList),
1558
1571
detail::getSyclObjImpl (BufferRef).get (), AdjustedDim, sizeof (DataT),
@@ -1579,13 +1592,16 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1579
1592
const property_list &PropertyList = {},
1580
1593
const detail::code_location CodeLoc = detail::code_location::current ())
1581
1594
#ifdef __SYCL_DEVICE_ONLY__
1582
- : impl (id<AdjustedDim>(), range<1 >{1 }, BufferRef.get_range ()) {
1595
+ : impl (id<AdjustedDim>(), detail::GetZeroDimAccessRange (BufferRef),
1596
+ BufferRef.get_range ()) {
1583
1597
(void )CommandGroupHandler;
1584
1598
(void )PropertyList;
1585
1599
}
1586
1600
#else
1587
1601
: AccessorBaseHost (
1588
- /* Offset=*/ {0 , 0 , 0 }, detail::convertToArrayOfN<3 , 1 >(range<1 >{1 }),
1602
+ /* Offset=*/ {0 , 0 , 0 },
1603
+ detail::convertToArrayOfN<3 , 1 >(
1604
+ detail::GetZeroDimAccessRange (BufferRef)),
1589
1605
detail::convertToArrayOfN<3 , 1 >(BufferRef.get_range ()),
1590
1606
getAdjustedMode (PropertyList),
1591
1607
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
@@ -1612,13 +1628,16 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1612
1628
{},
1613
1629
const detail::code_location CodeLoc = detail::code_location::current ())
1614
1630
#ifdef __SYCL_DEVICE_ONLY__
1615
- : impl (id<AdjustedDim>(), range<1 >{1 }, BufferRef.get_range ()) {
1631
+ : impl (id<AdjustedDim>(), detail::GetZeroDimAccessRange (BufferRef),
1632
+ BufferRef.get_range ()) {
1616
1633
(void )CommandGroupHandler;
1617
1634
(void )PropertyList;
1618
1635
}
1619
1636
#else
1620
1637
: AccessorBaseHost (
1621
- /* Offset=*/ {0 , 0 , 0 }, detail::convertToArrayOfN<3 , 1 >(range<1 >{1 }),
1638
+ /* Offset=*/ {0 , 0 , 0 },
1639
+ detail::convertToArrayOfN<3 , 1 >(
1640
+ detail::GetZeroDimAccessRange (BufferRef)),
1622
1641
detail::convertToArrayOfN<3 , 1 >(BufferRef.get_range ()),
1623
1642
getAdjustedMode (PropertyList),
1624
1643
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
@@ -2416,10 +2435,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
2416
2435
private:
2417
2436
template <int Dims, typename = std::enable_if_t <(Dims > 0 )>>
2418
2437
range<Dims> getRange () const {
2419
- if constexpr (Dimensions == 0 )
2420
- return range<1 >{1 };
2421
- else
2422
- return detail::convertToArrayOfN<Dims, 1 >(getAccessRange ());
2438
+ return detail::convertToArrayOfN<AdjustedDim, 1 >(getAccessRange ());
2423
2439
}
2424
2440
2425
2441
template <int Dims = Dimensions, typename = std::enable_if_t <(Dims > 0 )>>
0 commit comments