diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-06-13 01:49:26 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-06-13 01:49:26 +0200 |
| commit | a1ff450a68e115e884f3ced8ba17fe5971202da4 (patch) | |
| tree | ecc8eb6011832a3a03a135a0604f7ba77d33606b | |
| parent | b35aeae5b443e9c3b2ae66eb40c6e31be36d2dcd (diff) | |
| parent | 427f1a49f677395fbc4415f2917207fb7e4bc061 (diff) | |
| download | rust-a1ff450a68e115e884f3ced8ba17fe5971202da4.tar.gz rust-a1ff450a68e115e884f3ced8ba17fe5971202da4.zip | |
Rollup merge of #61398 - kennytm:stabilize-copy-within, r=SimonSapin
Stabilize copy_within Closes #54236.
| -rw-r--r-- | src/libcore/slice/mod.rs | 7 | ||||
| -rw-r--r-- | src/libcore/tests/lib.rs | 1 | ||||
| -rw-r--r-- | src/libcore/tests/slice.rs | 14 |
3 files changed, 17 insertions, 5 deletions
diff --git a/src/libcore/slice/mod.rs b/src/libcore/slice/mod.rs index c9c73f4d66e..d93e5a9ca2b 100644 --- a/src/libcore/slice/mod.rs +++ b/src/libcore/slice/mod.rs @@ -2146,14 +2146,13 @@ impl<T> [T] { /// Copying four bytes within a slice: /// /// ``` - /// # #![feature(copy_within)] /// let mut bytes = *b"Hello, World!"; /// /// bytes.copy_within(1..5, 8); /// /// assert_eq!(&bytes, b"Hello, Wello!"); /// ``` - #[unstable(feature = "copy_within", issue = "54236")] + #[stable(feature = "copy_within", since = "1.37.0")] pub fn copy_within<R: ops::RangeBounds<usize>>(&mut self, src: R, dest: usize) where T: Copy, @@ -2178,8 +2177,8 @@ impl<T> [T] { assert!(dest <= self.len() - count, "dest is out of bounds"); unsafe { ptr::copy( - self.get_unchecked(src_start), - self.get_unchecked_mut(dest), + self.as_ptr().add(src_start), + self.as_mut_ptr().add(dest), count, ); } diff --git a/src/libcore/tests/lib.rs b/src/libcore/tests/lib.rs index 928bdd7a760..bf072a9243b 100644 --- a/src/libcore/tests/lib.rs +++ b/src/libcore/tests/lib.rs @@ -28,7 +28,6 @@ #![feature(inner_deref)] #![feature(slice_internals)] #![feature(slice_partition_dedup)] -#![feature(copy_within)] #![feature(int_error_matching)] #![feature(const_fn)] #![warn(rust_2018_idioms)] diff --git a/src/libcore/tests/slice.rs b/src/libcore/tests/slice.rs index 9710f019f4e..eaa799fa96e 100644 --- a/src/libcore/tests/slice.rs +++ b/src/libcore/tests/slice.rs @@ -1512,6 +1512,13 @@ fn test_copy_within() { let mut bytes = *b"Hello, World!"; bytes.copy_within(.., 0); assert_eq!(&bytes, b"Hello, World!"); + + // Ensure that copying at the end of slice won't cause UB. + let mut bytes = *b"Hello, World!"; + bytes.copy_within(13..13, 5); + assert_eq!(&bytes, b"Hello, World!"); + bytes.copy_within(5..5, 13); + assert_eq!(&bytes, b"Hello, World!"); } #[test] @@ -1536,6 +1543,13 @@ fn test_copy_within_panics_src_inverted() { // 2 is greater than 1, so this range is invalid. bytes.copy_within(2..1, 0); } +#[test] +#[should_panic(expected = "attempted to index slice up to maximum usize")] +fn test_copy_within_panics_src_out_of_bounds() { + let mut bytes = *b"Hello, World!"; + // an inclusive range ending at usize::max_value() would make src_end overflow + bytes.copy_within(usize::max_value()..=usize::max_value(), 0); +} #[test] fn test_is_sorted() { |
