Skip to content

Commit 350004f

Browse files
committed
Auto merge of #1253 - RalfJung:vec-extend, r=RalfJung
test Vec::extend Currently fails, until rust-lang/rust#70301 gets fixed.
2 parents ae2a811 + 3eb76f4 commit 350004f

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

rust-version

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6050e523bae6de61de4e060facc43dc512adaccd
1+
e6cef0445779724b469ab7b9a8d3c05d9e848ca8
File renamed without changes.

tests/run-pass/vecs.rs renamed to tests/run-pass/vec.rs

+38
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,39 @@ fn vec_reallocate() -> Vec<u8> {
7171
v
7272
}
7373

74+
fn vec_push_ptr_stable() {
75+
let mut v = Vec::with_capacity(10);
76+
v.push(0);
77+
let v0 = unsafe { &mut *(&mut v[0] as *mut _) }; // laundering the lifetime -- we take care that `v` does not reallocate, so that's okay.
78+
v.push(1);
79+
let _val = *v0;
80+
}
81+
82+
fn vec_extend_ptr_stable() {
83+
let mut v = Vec::with_capacity(10);
84+
v.push(0);
85+
let v0 = unsafe { &mut *(&mut v[0] as *mut _) }; // laundering the lifetime -- we take care that `v` does not reallocate, so that's okay.
86+
// `slice::Iter` (with `T: Copy`) specialization
87+
v.extend(&[1]);
88+
let _val = *v0;
89+
// `vec::IntoIter` specialization
90+
v.extend(vec![2]);
91+
let _val = *v0;
92+
// `TrustedLen` specialization
93+
v.extend(std::iter::once(3));
94+
let _val = *v0;
95+
// base case
96+
v.extend(std::iter::once(3).filter(|_| true));
97+
let _val = *v0;
98+
}
99+
100+
fn vec_truncate_ptr_stable() {
101+
let mut v = vec![0; 10];
102+
let v0 = unsafe { &mut *(&mut v[0] as *mut _) }; // laundering the lifetime -- we take care that `v` does not reallocate, so that's okay.
103+
v.truncate(5);
104+
let _val = *v0;
105+
}
106+
74107
fn main() {
75108
assert_eq!(vec_reallocate().len(), 5);
76109

@@ -89,4 +122,9 @@ fn main() {
89122
// Test interesting empty slice comparison
90123
// (one is a real pointer, one an integer pointer).
91124
assert_eq!((200..-5).step_by(1).collect::<Vec<isize>>(), []);
125+
126+
// liballoc has a more extensive test of this, but let's at least do a smoke test here.
127+
vec_push_ptr_stable();
128+
vec_extend_ptr_stable();
129+
vec_truncate_ptr_stable();
92130
}

0 commit comments

Comments
 (0)