@@ -1798,3 +1798,38 @@ def test__copy_utils():
17981798 check__take_multi_index (cu ._take_multi_index )
17991799 check__place_impl_validation (cu ._place_impl )
18001800 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