@@ -1798,3 +1798,38 @@ def test__copy_utils():
1798
1798
check__take_multi_index (cu ._take_multi_index )
1799
1799
check__place_impl_validation (cu ._place_impl )
1800
1800
check__put_multi_index_validation (cu ._put_multi_index )
1801
+
1802
+
1803
+ @pytest .mark .parametrize ("mode" , ["wrap" , "clip" ])
1804
+ def test_take_indices_oob_py_ssize_t (mode ):
1805
+ get_queue_or_skip ()
1806
+
1807
+ x = dpt .arange (10 , dtype = "i4" )
1808
+ inds1 = dpt .full (5 , dpt .iinfo (dpt .uint64 ).max , dtype = dpt .uint64 )
1809
+ inds2 = dpt .full (5 , dpt .iinfo (dpt .uint64 ).max , dtype = dpt .uint64 )
1810
+
1811
+ # sweep through a small range of indices
1812
+ # to check that OOB indices are well-behaved
1813
+ for i in range (1 , 10 ):
1814
+ inds2 -= i
1815
+ r1 = dpt .take (x , inds1 , mode = mode )
1816
+ r2 = dpt .take (x , inds2 , mode = mode )
1817
+
1818
+ assert dpt .all (r1 == r2 )
1819
+
1820
+
1821
+ @pytest .mark .parametrize ("mode" , ["wrap" , "clip" ])
1822
+ def test_put_indices_oob_py_ssize_t (mode ):
1823
+ get_queue_or_skip ()
1824
+
1825
+ x = dpt .full (10 , - 1 , dtype = "i4" )
1826
+ inds = dpt .full (1 , dpt .iinfo (dpt .uint64 ).max , dtype = dpt .uint64 )
1827
+
1828
+ # OOB inds are positive, so always
1829
+ # clip to the top of range
1830
+ for i in range (1 , 10 ):
1831
+ inds -= i
1832
+ dpt .put (x , inds , i , mode = mode )
1833
+
1834
+ assert dpt .all (x [:- 1 ] == - 1 )
1835
+ assert x [- 1 ] == i
0 commit comments