@@ -66,7 +66,7 @@ use core::hash::{self, Hash};
6666use core:: intrinsics:: { arith_offset, assume} ;
6767use core:: iter:: { FromIterator , FusedIterator , TrustedLen } ;
6868use core:: marker:: PhantomData ;
69- use core:: mem;
69+ use core:: mem:: { self , ManuallyDrop } ;
7070use core:: ops:: Bound :: { Excluded , Included , Unbounded } ;
7171use core:: ops:: { self , Index , IndexMut , RangeBounds } ;
7272use core:: ptr:: { self , NonNull } ;
@@ -392,7 +392,7 @@ impl<T> Vec<T> {
392392 /// ```
393393 #[ unstable( feature = "vec_into_raw_parts" , reason = "new API" , issue = "65816" ) ]
394394 pub fn into_raw_parts ( self ) -> ( * mut T , usize , usize ) {
395- let mut me = mem :: ManuallyDrop :: new ( self ) ;
395+ let mut me = ManuallyDrop :: new ( self ) ;
396396 ( me. as_mut_ptr ( ) , me. len ( ) , me. capacity ( ) )
397397 }
398398
@@ -678,9 +678,9 @@ impl<T> Vec<T> {
678678 pub fn into_boxed_slice ( mut self ) -> Box < [ T ] > {
679679 unsafe {
680680 self . shrink_to_fit ( ) ;
681- let buf = ptr :: read ( & self . buf ) ;
682- let len = self . len ( ) ;
683- mem :: forget ( self ) ;
681+ let me = ManuallyDrop :: new ( self ) ;
682+ let buf = ptr :: read ( & me . buf ) ;
683+ let len = me . len ( ) ;
684684 buf. into_box ( len) . assume_init ( )
685685 }
686686 }
@@ -1949,16 +1949,16 @@ impl<T> IntoIterator for Vec<T> {
19491949 /// }
19501950 /// ```
19511951 #[ inline]
1952- fn into_iter ( mut self ) -> IntoIter < T > {
1952+ fn into_iter ( self ) -> IntoIter < T > {
19531953 unsafe {
1954- let begin = self . as_mut_ptr ( ) ;
1954+ let mut me = ManuallyDrop :: new ( self ) ;
1955+ let begin = me. as_mut_ptr ( ) ;
19551956 let end = if mem:: size_of :: < T > ( ) == 0 {
1956- arith_offset ( begin as * const i8 , self . len ( ) as isize ) as * const T
1957+ arith_offset ( begin as * const i8 , me . len ( ) as isize ) as * const T
19571958 } else {
1958- begin. add ( self . len ( ) ) as * const T
1959+ begin. add ( me . len ( ) ) as * const T
19591960 } ;
1960- let cap = self . buf . capacity ( ) ;
1961- mem:: forget ( self ) ;
1961+ let cap = me. buf . capacity ( ) ;
19621962 IntoIter {
19631963 buf : NonNull :: new_unchecked ( begin) ,
19641964 phantom : PhantomData ,
@@ -2081,9 +2081,8 @@ impl<T> SpecExtend<T, IntoIter<T>> for Vec<T> {
20812081 // has not been advanced at all.
20822082 if iterator. buf . as_ptr ( ) as * const _ == iterator. ptr {
20832083 unsafe {
2084- let vec = Vec :: from_raw_parts ( iterator. buf . as_ptr ( ) , iterator. len ( ) , iterator. cap ) ;
2085- mem:: forget ( iterator) ;
2086- vec
2084+ let it = ManuallyDrop :: new ( iterator) ;
2085+ Vec :: from_raw_parts ( it. buf . as_ptr ( ) , it. len ( ) , it. cap )
20872086 }
20882087 } else {
20892088 let mut vector = Vec :: new ( ) ;
0 commit comments