Skip to content

Commit 76fa587

Browse files
authoredAug 17, 2016
Auto merge of #35733 - apasel422:issue-35721, r=alexcrichton
Make `vec::IntoIter` covariant again Closes #35721 r? @alexcrichton
2 parents 6c0d66a + 7e148cd commit 76fa587

File tree

2 files changed

+11
-7
lines changed

2 files changed

+11
-7
lines changed
 

‎src/libcollections/vec.rs

+9-6
Original file line numberDiff line numberDiff line change
@@ -1453,10 +1453,11 @@ impl<T> IntoIterator for Vec<T> {
14531453
} else {
14541454
begin.offset(self.len() as isize) as *const T
14551455
};
1456-
let buf = ptr::read(&self.buf);
1456+
let cap = self.buf.cap();
14571457
mem::forget(self);
14581458
IntoIter {
1459-
_buf: buf,
1459+
buf: Shared::new(begin),
1460+
cap: cap,
14601461
ptr: begin,
14611462
end: end,
14621463
}
@@ -1708,8 +1709,9 @@ impl<'a, T> FromIterator<T> for Cow<'a, [T]> where T: Clone {
17081709
/// [`IntoIterator`]: ../../std/iter/trait.IntoIterator.html
17091710
#[stable(feature = "rust1", since = "1.0.0")]
17101711
pub struct IntoIter<T> {
1711-
_buf: RawVec<T>,
1712-
ptr: *mut T,
1712+
buf: Shared<T>,
1713+
cap: usize,
1714+
ptr: *const T,
17131715
end: *const T,
17141716
}
17151717

@@ -1750,7 +1752,7 @@ impl<T> IntoIter<T> {
17501752
#[unstable(feature = "vec_into_iter_as_slice", issue = "35601")]
17511753
pub fn as_mut_slice(&self) -> &mut [T] {
17521754
unsafe {
1753-
slice::from_raw_parts_mut(self.ptr, self.len())
1755+
slice::from_raw_parts_mut(self.ptr as *mut T, self.len())
17541756
}
17551757
}
17561758
}
@@ -1846,9 +1848,10 @@ impl<T> Drop for IntoIter<T> {
18461848
#[unsafe_destructor_blind_to_params]
18471849
fn drop(&mut self) {
18481850
// destroy the remaining elements
1849-
for _x in self {}
1851+
for _x in self.by_ref() {}
18501852

18511853
// RawVec handles deallocation
1854+
let _ = unsafe { RawVec::from_raw_parts(*self.buf, self.cap) };
18521855
}
18531856
}
18541857

‎src/libcollectionstest/vec.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use std::borrow::Cow;
1212
use std::iter::{FromIterator, repeat};
1313
use std::mem::size_of;
14-
use std::vec::Drain;
14+
use std::vec::{Drain, IntoIter};
1515

1616
use test::Bencher;
1717

@@ -537,6 +537,7 @@ fn test_cow_from() {
537537
#[allow(dead_code)]
538538
fn assert_covariance() {
539539
fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> { d }
540+
fn into_iter<'new>(i: IntoIter<&'static str>) -> IntoIter<&'new str> { i }
540541
}
541542

542543
#[bench]

0 commit comments

Comments
 (0)
Please sign in to comment.