@@ -66,7 +66,7 @@ use core::hash::{self, Hash};
66
66
use core:: intrinsics:: { arith_offset, assume} ;
67
67
use core:: iter:: { FromIterator , FusedIterator , TrustedLen } ;
68
68
use core:: marker:: PhantomData ;
69
- use core:: mem;
69
+ use core:: mem:: { self , ManuallyDrop } ;
70
70
use core:: ops:: Bound :: { Excluded , Included , Unbounded } ;
71
71
use core:: ops:: { self , Index , IndexMut , RangeBounds } ;
72
72
use core:: ptr:: { self , NonNull } ;
@@ -392,7 +392,7 @@ impl<T> Vec<T> {
392
392
/// ```
393
393
#[ unstable( feature = "vec_into_raw_parts" , reason = "new API" , issue = "65816" ) ]
394
394
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 ) ;
396
396
( me. as_mut_ptr ( ) , me. len ( ) , me. capacity ( ) )
397
397
}
398
398
@@ -678,9 +678,9 @@ impl<T> Vec<T> {
678
678
pub fn into_boxed_slice ( mut self ) -> Box < [ T ] > {
679
679
unsafe {
680
680
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 ( ) ;
684
684
buf. into_box ( len) . assume_init ( )
685
685
}
686
686
}
@@ -1949,16 +1949,16 @@ impl<T> IntoIterator for Vec<T> {
1949
1949
/// }
1950
1950
/// ```
1951
1951
#[ inline]
1952
- fn into_iter ( mut self ) -> IntoIter < T > {
1952
+ fn into_iter ( self ) -> IntoIter < T > {
1953
1953
unsafe {
1954
- let begin = self . as_mut_ptr ( ) ;
1954
+ let mut me = ManuallyDrop :: new ( self ) ;
1955
+ let begin = me. as_mut_ptr ( ) ;
1955
1956
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
1957
1958
} else {
1958
- begin. add ( self . len ( ) ) as * const T
1959
+ begin. add ( me . len ( ) ) as * const T
1959
1960
} ;
1960
- let cap = self . buf . capacity ( ) ;
1961
- mem:: forget ( self ) ;
1961
+ let cap = me. buf . capacity ( ) ;
1962
1962
IntoIter {
1963
1963
buf : NonNull :: new_unchecked ( begin) ,
1964
1964
phantom : PhantomData ,
@@ -2081,9 +2081,8 @@ impl<T> SpecExtend<T, IntoIter<T>> for Vec<T> {
2081
2081
// has not been advanced at all.
2082
2082
if iterator. buf . as_ptr ( ) as * const _ == iterator. ptr {
2083
2083
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 )
2087
2086
}
2088
2087
} else {
2089
2088
let mut vector = Vec :: new ( ) ;
0 commit comments