diff --git a/src/liballoc/tests/vec.rs b/src/liballoc/tests/vec.rs index a90bc58cbfd..6321e7154e7 100644 --- a/src/liballoc/tests/vec.rs +++ b/src/liballoc/tests/vec.rs @@ -1378,6 +1378,11 @@ fn test_stable_pointers() { v.remove(1); v.pop().unwrap(); assert_eq!(*v0, 13); + v.push(1); + v.swap_remove(1); + assert_eq!(v.len(), 2); + v.swap_remove(1); // swap_remove the last element + assert_eq!(*v0, 13); // Appending v.append(&mut vec![27, 19]); diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs index dc2a246f817..c600a6b649f 100644 --- a/src/liballoc/vec.rs +++ b/src/liballoc/vec.rs @@ -963,12 +963,13 @@ impl Vec { #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub fn swap_remove(&mut self, index: usize) -> T { + assert!(index < self.len); unsafe { // We replace self[index] with the last element. Note that if the - // bounds check on hole succeeds there must be a last element (which + // bounds check above succeeds there must be a last element (which // can be self[index] itself). - let hole: *mut T = &mut self[index]; - let last = ptr::read(self.get_unchecked(self.len - 1)); + let last = ptr::read(self.as_ptr().add(self.len - 1)); + let hole: *mut T = self.as_mut_ptr().add(index); self.len -= 1; ptr::replace(hole, last) }