@@ -87,12 +87,13 @@ unsafe impl<T: Sync> Send for Iter<'_, T> {}
8787impl < ' a , T > Iter < ' a , T > {
8888 #[ inline]
8989 pub ( super ) fn new ( slice : & ' a [ T ] ) -> Self {
90- let ptr = slice. as_ptr ( ) ;
90+ let len = slice. len ( ) ;
91+ let ptr: NonNull < T > = NonNull :: from ( slice) . cast ( ) ;
9192 // SAFETY: Similar to `IterMut::new`.
9293 unsafe {
93- let end_or_len = if T :: IS_ZST { invalid ( slice . len ( ) ) } else { ptr. add ( slice . len ( ) ) } ;
94+ let end_or_len = if T :: IS_ZST { invalid ( len) } else { ptr. as_ptr ( ) . add ( len ) } ;
9495
95- Self { ptr : NonNull :: new_unchecked ( ptr as * mut T ) , end_or_len, _marker : PhantomData }
96+ Self { ptr, end_or_len, _marker : PhantomData }
9697 }
9798 }
9899
@@ -208,7 +209,8 @@ unsafe impl<T: Send> Send for IterMut<'_, T> {}
208209impl < ' a , T > IterMut < ' a , T > {
209210 #[ inline]
210211 pub ( super ) fn new ( slice : & ' a mut [ T ] ) -> Self {
211- let ptr = slice. as_mut_ptr ( ) ;
212+ let len = slice. len ( ) ;
213+ let ptr: NonNull < T > = NonNull :: from ( slice) . cast ( ) ;
212214 // SAFETY: There are several things here:
213215 //
214216 // `ptr` has been obtained by `slice.as_ptr()` where `slice` is a valid
@@ -226,10 +228,9 @@ impl<'a, T> IterMut<'a, T> {
226228 // See the `next_unchecked!` and `is_empty!` macros as well as the
227229 // `post_inc_start` method for more information.
228230 unsafe {
229- let end_or_len =
230- if T :: IS_ZST { invalid_mut ( slice. len ( ) ) } else { ptr. add ( slice. len ( ) ) } ;
231+ let end_or_len = if T :: IS_ZST { invalid_mut ( len) } else { ptr. as_ptr ( ) . add ( len) } ;
231232
232- Self { ptr : NonNull :: new_unchecked ( ptr ) , end_or_len, _marker : PhantomData }
233+ Self { ptr, end_or_len, _marker : PhantomData }
233234 }
234235 }
235236
0 commit comments