From feb775c834361f635df9e3824f9d2ae9582becbb Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Thu, 22 Nov 2018 16:03:24 +0100 Subject: [PATCH] Drain only needs a shared reference --- src/liballoc/collections/vec_deque.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/liballoc/collections/vec_deque.rs b/src/liballoc/collections/vec_deque.rs index 60b5d8063bff2..4a3604f202f73 100644 --- a/src/liballoc/collections/vec_deque.rs +++ b/src/liballoc/collections/vec_deque.rs @@ -1019,19 +1019,17 @@ impl VecDeque { // the drain is complete and the Drain destructor is run. self.head = drain_tail; - // `deque` and `ring` overlap in what they point to, so we must make sure - // that `ring` is "derived-from" `deque`, or else even just creating ring - // from `self` already invalidates `deque`. - let deque = NonNull::from(&mut *self); - Drain { - deque, + deque: NonNull::from(&mut *self), after_tail: drain_head, after_head: head, iter: Iter { tail: drain_tail, head: drain_head, - ring: unsafe { (&mut *deque.as_ptr()).buffer_as_mut_slice() }, + // Crucially, we only create shared references from `self` here and read from + // it. We do not write to `self` nor reborrow to a mutable reference. + // Hence the raw pointer we created above, for `deque`, remains valid. + ring: unsafe { self.buffer_as_slice() }, }, } }