diff --git a/library/alloc/src/collections/vec_deque/splice.rs b/library/alloc/src/collections/vec_deque/splice.rs index cd98af7341ded..d7b9a96291c39 100644 --- a/library/alloc/src/collections/vec_deque/splice.rs +++ b/library/alloc/src/collections/vec_deque/splice.rs @@ -143,7 +143,11 @@ impl Drain<'_, T, A> { let new_tail_start = tail_start + additional; unsafe { - deque.wrap_copy(tail_start, new_tail_start, self.tail_len); + deque.wrap_copy( + deque.to_physical_idx(tail_start), + deque.to_physical_idx(new_tail_start), + self.tail_len, + ); } self.drain_len += additional; } diff --git a/library/alloctests/tests/vec_deque.rs b/library/alloctests/tests/vec_deque.rs index e06d18250a51a..92853fe00fd63 100644 --- a/library/alloctests/tests/vec_deque.rs +++ b/library/alloctests/tests/vec_deque.rs @@ -2336,3 +2336,14 @@ fn test_splice_forget() { std::mem::forget(v.splice(2..4, a)); assert_eq!(v, &[1, 2]); } + +#[test] +fn test_splice_wrapping() { + let mut vec = VecDeque::with_capacity(10); + vec.push_front(7u8); + vec.push_back(9); + + vec.splice(1..1, [8]); + + assert_eq!(Vec::from(vec), [7, 8, 9]); +}