@@ -71,6 +71,39 @@ fn vec_reallocate() -> Vec<u8> {
71
71
v
72
72
}
73
73
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
+
74
107
fn main ( ) {
75
108
assert_eq ! ( vec_reallocate( ) . len( ) , 5 ) ;
76
109
@@ -89,4 +122,9 @@ fn main() {
89
122
// Test interesting empty slice comparison
90
123
// (one is a real pointer, one an integer pointer).
91
124
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 ( ) ;
92
130
}
0 commit comments