diff options
| author | bors <bors@rust-lang.org> | 2016-07-28 05:24:31 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-07-28 05:24:31 -0700 |
| commit | cec262e55a92ad15196c4ea6d490fb6ef6bccab4 (patch) | |
| tree | 6e726ce8cb2e0d80f4bd02d8b8fd1e9b6e27f526 /src/libcollections | |
| parent | 1895bf760d4f7d11510619fd7ee794aa5afc4803 (diff) | |
| parent | d1e2a935d2d35e768d0a56af7938c725f243fc28 (diff) | |
| download | rust-cec262e55a92ad15196c4ea6d490fb6ef6bccab4.tar.gz rust-cec262e55a92ad15196c4ea6d490fb6ef6bccab4.zip | |
Auto merge of #34951 - tomgarcia:covariant-vec, r=brson
Make vec::Drain and binary_heap::Drain covariant I removed all mutable pointers/references, and added covariance tests similar to the ones in #32635. It builds and passes the tests, but I noticed that there weren't any tests of Drain's behaviour (at least not in libcollectionstest), so I'm not sure if my changes accidently broke Drain's behaviour. Should I add some tests for that (and if so, what should the tests include)?
Diffstat (limited to 'src/libcollections')
| -rw-r--r-- | src/libcollections/vec.rs | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/libcollections/vec.rs b/src/libcollections/vec.rs index 967baccd274..275f38b2f78 100644 --- a/src/libcollections/vec.rs +++ b/src/libcollections/vec.rs @@ -73,6 +73,7 @@ use core::mem; use core::ops::{Index, IndexMut}; use core::ops; use core::ptr; +use core::ptr::Shared; use core::slice; use super::SpecExtend; @@ -899,8 +900,8 @@ impl<T> Vec<T> { Drain { tail_start: end, tail_len: len - end, - iter: range_slice.iter_mut(), - vec: self as *mut _, + iter: range_slice.iter(), + vec: Shared::new(self as *mut _), } } } @@ -1806,8 +1807,8 @@ pub struct Drain<'a, T: 'a> { /// Length of tail tail_len: usize, /// Current remaining range to remove - iter: slice::IterMut<'a, T>, - vec: *mut Vec<T>, + iter: slice::Iter<'a, T>, + vec: Shared<Vec<T>>, } #[stable(feature = "drain", since = "1.6.0")] @@ -1845,7 +1846,7 @@ impl<'a, T> Drop for Drain<'a, T> { if self.tail_len > 0 { unsafe { - let source_vec = &mut *self.vec; + let source_vec = &mut **self.vec; // memmove back untouched tail, update to new length let start = source_vec.len(); let tail = self.tail_start; |
