@@ -39,7 +39,7 @@ use core::{
3939 fmt,
4040 hash:: { Hash , Hasher } ,
4141 iter:: { IntoIterator , FromIterator , repeat} ,
42- mem:: { ManuallyDrop , self } ,
42+ mem:: { MaybeUninit , self } ,
4343 ops,
4444 ptr:: { self , NonNull } ,
4545 slice,
@@ -213,26 +213,26 @@ impl<'a, T: 'a> Drop for Drain<'a,T> {
213213
214214#[ cfg( feature = "union" ) ]
215215union SmallVecData < A : Array > {
216- inline : ManuallyDrop < A > ,
216+ inline : MaybeUninit < A > ,
217217 heap : ( NonNull < A :: Item > , usize ) ,
218218}
219219
220220#[ cfg( feature = "union" ) ]
221221impl < A : Array > SmallVecData < A > {
222222 #[ inline]
223223 unsafe fn inline ( & self ) -> & A {
224- & self . inline
224+ & * self . inline . as_ptr ( )
225225 }
226226 #[ inline]
227227 unsafe fn inline_mut ( & mut self ) -> & mut A {
228- & mut self . inline
228+ & mut * self . inline . as_mut_ptr ( )
229229 }
230230 #[ inline]
231- fn from_inline ( inline : A ) -> SmallVecData < A > {
232- SmallVecData { inline : ManuallyDrop :: new ( inline ) }
231+ fn from_inline ( inline : MaybeUninit < A > ) -> SmallVecData < A > {
232+ SmallVecData { inline }
233233 }
234234 #[ inline]
235- unsafe fn into_inline ( self ) -> A { ManuallyDrop :: into_inner ( self . inline ) }
235+ unsafe fn into_inline ( self ) -> A { self . inline . assume_init ( ) }
236236 #[ inline]
237237 unsafe fn heap ( & self ) -> ( * mut A :: Item , usize ) {
238238 ( self . heap . 0 . as_ptr ( ) , self . heap . 1 )
@@ -249,7 +249,7 @@ impl<A: Array> SmallVecData<A> {
249249
250250#[ cfg( not( feature = "union" ) ) ]
251251enum SmallVecData < A : Array > {
252- Inline ( ManuallyDrop < A > ) ,
252+ Inline ( MaybeUninit < A > ) ,
253253 Heap ( ( NonNull < A :: Item > , usize ) ) ,
254254}
255255
@@ -258,25 +258,25 @@ impl<A: Array> SmallVecData<A> {
258258 #[ inline]
259259 unsafe fn inline ( & self ) -> & A {
260260 match * self {
261- SmallVecData :: Inline ( ref a) => a ,
261+ SmallVecData :: Inline ( ref a) => & * a . as_ptr ( ) ,
262262 _ => debug_unreachable ! ( ) ,
263263 }
264264 }
265265 #[ inline]
266266 unsafe fn inline_mut ( & mut self ) -> & mut A {
267267 match * self {
268- SmallVecData :: Inline ( ref mut a) => a ,
268+ SmallVecData :: Inline ( ref mut a) => & mut * a . as_mut_ptr ( ) ,
269269 _ => debug_unreachable ! ( ) ,
270270 }
271271 }
272272 #[ inline]
273- fn from_inline ( inline : A ) -> SmallVecData < A > {
274- SmallVecData :: Inline ( ManuallyDrop :: new ( inline) )
273+ fn from_inline ( inline : MaybeUninit < A > ) -> SmallVecData < A > {
274+ SmallVecData :: Inline ( inline)
275275 }
276276 #[ inline]
277277 unsafe fn into_inline ( self ) -> A {
278278 match self {
279- SmallVecData :: Inline ( a) => ManuallyDrop :: into_inner ( a ) ,
279+ SmallVecData :: Inline ( a) => a . assume_init ( ) ,
280280 _ => debug_unreachable ! ( ) ,
281281 }
282282 }
@@ -421,7 +421,7 @@ impl<A: Array> SmallVec<A> {
421421 pub fn from_buf ( buf : A ) -> SmallVec < A > {
422422 SmallVec {
423423 capacity : A :: size ( ) ,
424- data : SmallVecData :: from_inline ( buf) ,
424+ data : SmallVecData :: from_inline ( MaybeUninit :: new ( buf) ) ,
425425 }
426426 }
427427
@@ -461,7 +461,7 @@ impl<A: Array> SmallVec<A> {
461461 pub unsafe fn from_buf_and_len_unchecked ( buf : A , len : usize ) -> SmallVec < A > {
462462 SmallVec {
463463 capacity : len,
464- data : SmallVecData :: from_inline ( buf) ,
464+ data : SmallVecData :: from_inline ( MaybeUninit :: new ( buf) ) ,
465465 }
466466 }
467467
@@ -979,8 +979,9 @@ impl<A: Array> SmallVec<A> where A::Item: Copy {
979979 SmallVec {
980980 capacity : len,
981981 data : SmallVecData :: from_inline ( unsafe {
982- let mut data: A = mem:: uninitialized ( ) ;
983- ptr:: copy_nonoverlapping ( slice. as_ptr ( ) , data. as_mut_ptr ( ) , len) ;
982+ let mut data = MaybeUninit :: < A > :: uninit ( ) ;
983+ let slice_mut = & mut * data. as_mut_ptr ( ) ;
984+ ptr:: copy_nonoverlapping ( slice. as_ptr ( ) , slice_mut. as_mut_ptr ( ) , len) ;
984985 data
985986 } )
986987 }
@@ -994,7 +995,6 @@ impl<A: Array> SmallVec<A> where A::Item: Copy {
994995 }
995996 }
996997 }
997-
998998 /// Copy elements from a slice into the vector at position `index`, shifting any following
999999 /// elements toward the back.
10001000 ///
0 commit comments