@@ -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+
74107fn 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