@@ -87,12 +87,13 @@ unsafe impl<T: Sync> Send for Iter<'_, T> {}
87
87
impl < ' a , T > Iter < ' a , T > {
88
88
#[ inline]
89
89
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 ( ) ;
91
92
// SAFETY: Similar to `IterMut::new`.
92
93
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 ) } ;
94
95
95
- Self { ptr : NonNull :: new_unchecked ( ptr as * mut T ) , end_or_len, _marker : PhantomData }
96
+ Self { ptr, end_or_len, _marker : PhantomData }
96
97
}
97
98
}
98
99
@@ -208,7 +209,8 @@ unsafe impl<T: Send> Send for IterMut<'_, T> {}
208
209
impl < ' a , T > IterMut < ' a , T > {
209
210
#[ inline]
210
211
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 ( ) ;
212
214
// SAFETY: There are several things here:
213
215
//
214
216
// `ptr` has been obtained by `slice.as_ptr()` where `slice` is a valid
@@ -226,10 +228,9 @@ impl<'a, T> IterMut<'a, T> {
226
228
// See the `next_unchecked!` and `is_empty!` macros as well as the
227
229
// `post_inc_start` method for more information.
228
230
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) } ;
231
232
232
- Self { ptr : NonNull :: new_unchecked ( ptr ) , end_or_len, _marker : PhantomData }
233
+ Self { ptr, end_or_len, _marker : PhantomData }
233
234
}
234
235
}
235
236
0 commit comments