@@ -2243,11 +2243,11 @@ fn write_in_place_with_drop<T>(
22432243#[ rustc_unsafe_specialization_marker]
22442244trait SourceIterMarker : SourceIter < Source : AsIntoIter > { }
22452245
2246- impl < T > SourceIterMarker for T where T : SourceIter < Source : AsIntoIter > { }
2246+ impl < T > SourceIterMarker for T where T : SourceIter < Source : AsIntoIter > + InPlaceIterable { }
22472247
22482248impl < T , I > SpecFrom < T , I > for Vec < T >
22492249where
2250- I : Iterator < Item = T > + InPlaceIterable + SourceIterMarker ,
2250+ I : Iterator < Item = T > + SourceIterMarker ,
22512251{
22522252 default fn from_iter ( mut iterator : I ) -> Self {
22532253 // Additional requirements which cannot expressed via trait bounds. We rely on const eval
@@ -2920,6 +2920,17 @@ impl<T> Iterator for IntoIter<T> {
29202920 fn count ( self ) -> usize {
29212921 self . len ( )
29222922 }
2923+
2924+ unsafe fn get_unchecked ( & mut self , i : usize ) -> Self :: Item
2925+ where
2926+ Self : TrustedRandomAccess ,
2927+ {
2928+ // SAFETY: the caller must uphold the contract for
2929+ // `Iterator::get_unchecked`.
2930+ unsafe {
2931+ if mem:: size_of :: < T > ( ) == 0 { mem:: zeroed ( ) } else { ptr:: read ( self . ptr . add ( i) ) }
2932+ }
2933+ }
29232934}
29242935
29252936#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -2967,12 +2978,6 @@ unsafe impl<T> TrustedRandomAccess for IntoIter<T>
29672978where
29682979 T : Copy ,
29692980{
2970- unsafe fn get_unchecked ( & mut self , i : usize ) -> Self :: Item {
2971- unsafe {
2972- if mem:: size_of :: < T > ( ) == 0 { mem:: zeroed ( ) } else { ptr:: read ( self . ptr . add ( i) ) }
2973- }
2974- }
2975-
29762981 fn may_have_side_effect ( ) -> bool {
29772982 false
29782983 }
0 commit comments