Make slice iterator constructors unstably const

This commit is contained in:
Daniel Bloom 2025-02-24 14:02:13 -08:00 committed by Daniel Bloom
parent 3f5502370b
commit 20417a9522
8 changed files with 190 additions and 181 deletions

View file

@ -93,9 +93,9 @@ unsafe impl<T: Sync> Send for Iter<'_, T> {}
impl<'a, T> Iter<'a, T> {
#[inline]
pub(super) fn new(slice: &'a [T]) -> Self {
pub(super) const fn new(slice: &'a [T]) -> Self {
let len = slice.len();
let ptr: NonNull<T> = NonNull::from(slice).cast();
let ptr: NonNull<T> = NonNull::from_ref(slice).cast();
// SAFETY: Similar to `IterMut::new`.
unsafe {
let end_or_len =
@ -218,9 +218,9 @@ unsafe impl<T: Send> Send for IterMut<'_, T> {}
impl<'a, T> IterMut<'a, T> {
#[inline]
pub(super) fn new(slice: &'a mut [T]) -> Self {
pub(super) const fn new(slice: &'a mut [T]) -> Self {
let len = slice.len();
let ptr: NonNull<T> = NonNull::from(slice).cast();
let ptr: NonNull<T> = NonNull::from_mut(slice).cast();
// SAFETY: There are several things here:
//
// `ptr` has been obtained by `slice.as_ptr()` where `slice` is a valid
@ -1335,7 +1335,7 @@ pub struct Windows<'a, T: 'a> {
impl<'a, T: 'a> Windows<'a, T> {
#[inline]
pub(super) fn new(slice: &'a [T], size: NonZero<usize>) -> Self {
pub(super) const fn new(slice: &'a [T], size: NonZero<usize>) -> Self {
Self { v: slice, size }
}
}
@ -1487,7 +1487,7 @@ pub struct Chunks<'a, T: 'a> {
impl<'a, T: 'a> Chunks<'a, T> {
#[inline]
pub(super) fn new(slice: &'a [T], size: usize) -> Self {
pub(super) const fn new(slice: &'a [T], size: usize) -> Self {
Self { v: slice, chunk_size: size }
}
}
@ -1677,7 +1677,7 @@ pub struct ChunksMut<'a, T: 'a> {
impl<'a, T: 'a> ChunksMut<'a, T> {
#[inline]
pub(super) fn new(slice: &'a mut [T], size: usize) -> Self {
pub(super) const fn new(slice: &'a mut [T], size: usize) -> Self {
Self { v: slice, chunk_size: size, _marker: PhantomData }
}
}
@ -1863,7 +1863,7 @@ pub struct ChunksExact<'a, T: 'a> {
impl<'a, T> ChunksExact<'a, T> {
#[inline]
pub(super) fn new(slice: &'a [T], chunk_size: usize) -> Self {
pub(super) const fn new(slice: &'a [T], chunk_size: usize) -> Self {
let rem = slice.len() % chunk_size;
let fst_len = slice.len() - rem;
// SAFETY: 0 <= fst_len <= slice.len() by construction above
@ -2043,7 +2043,7 @@ pub struct ChunksExactMut<'a, T: 'a> {
impl<'a, T> ChunksExactMut<'a, T> {
#[inline]
pub(super) fn new(slice: &'a mut [T], chunk_size: usize) -> Self {
pub(super) const fn new(slice: &'a mut [T], chunk_size: usize) -> Self {
let rem = slice.len() % chunk_size;
let fst_len = slice.len() - rem;
// SAFETY: 0 <= fst_len <= slice.len() by construction above
@ -2210,7 +2210,7 @@ pub struct ArrayWindows<'a, T: 'a, const N: usize> {
impl<'a, T: 'a, const N: usize> ArrayWindows<'a, T, N> {
#[inline]
pub(super) fn new(slice: &'a [T]) -> Self {
pub(super) const fn new(slice: &'a [T]) -> Self {
let num_windows = slice.len().saturating_sub(N - 1);
Self { slice_head: slice.as_ptr(), num: num_windows, marker: PhantomData }
}
@ -2334,8 +2334,10 @@ pub struct ArrayChunks<'a, T: 'a, const N: usize> {
}
impl<'a, T, const N: usize> ArrayChunks<'a, T, N> {
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
// #[rustc_const_unstable(feature = "slice_as_chunks", issue = "74985")]
#[inline]
pub(super) fn new(slice: &'a [T]) -> Self {
pub(super) const fn new(slice: &'a [T]) -> Self {
let (array_slice, rem) = slice.as_chunks();
Self { iter: array_slice.iter(), rem }
}
@ -2460,8 +2462,9 @@ pub struct ArrayChunksMut<'a, T: 'a, const N: usize> {
}
impl<'a, T, const N: usize> ArrayChunksMut<'a, T, N> {
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
pub(super) fn new(slice: &'a mut [T]) -> Self {
pub(super) const fn new(slice: &'a mut [T]) -> Self {
let (array_slice, rem) = slice.as_chunks_mut();
Self { iter: array_slice.iter_mut(), rem }
}
@ -2579,7 +2582,7 @@ pub struct RChunks<'a, T: 'a> {
impl<'a, T: 'a> RChunks<'a, T> {
#[inline]
pub(super) fn new(slice: &'a [T], size: usize) -> Self {
pub(super) const fn new(slice: &'a [T], size: usize) -> Self {
Self { v: slice, chunk_size: size }
}
}
@ -2759,7 +2762,7 @@ pub struct RChunksMut<'a, T: 'a> {
impl<'a, T: 'a> RChunksMut<'a, T> {
#[inline]
pub(super) fn new(slice: &'a mut [T], size: usize) -> Self {
pub(super) const fn new(slice: &'a mut [T], size: usize) -> Self {
Self { v: slice, chunk_size: size, _marker: PhantomData }
}
}
@ -2950,7 +2953,7 @@ pub struct RChunksExact<'a, T: 'a> {
impl<'a, T> RChunksExact<'a, T> {
#[inline]
pub(super) fn new(slice: &'a [T], chunk_size: usize) -> Self {
pub(super) const fn new(slice: &'a [T], chunk_size: usize) -> Self {
let rem = slice.len() % chunk_size;
// SAFETY: 0 <= rem <= slice.len() by construction above
let (fst, snd) = unsafe { slice.split_at_unchecked(rem) };
@ -2976,7 +2979,8 @@ impl<'a, T> RChunksExact<'a, T> {
/// ```
#[must_use]
#[stable(feature = "rchunks", since = "1.31.0")]
pub fn remainder(&self) -> &'a [T] {
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
pub const fn remainder(&self) -> &'a [T] {
self.rem
}
}
@ -3132,7 +3136,7 @@ pub struct RChunksExactMut<'a, T: 'a> {
impl<'a, T> RChunksExactMut<'a, T> {
#[inline]
pub(super) fn new(slice: &'a mut [T], chunk_size: usize) -> Self {
pub(super) const fn new(slice: &'a mut [T], chunk_size: usize) -> Self {
let rem = slice.len() % chunk_size;
// SAFETY: 0 <= rem <= slice.len() by construction above
let (fst, snd) = unsafe { slice.split_at_mut_unchecked(rem) };
@ -3144,7 +3148,8 @@ impl<'a, T> RChunksExactMut<'a, T> {
/// elements.
#[must_use = "`self` will be dropped if the result is not used"]
#[stable(feature = "rchunks", since = "1.31.0")]
pub fn into_remainder(self) -> &'a mut [T] {
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
pub const fn into_remainder(self) -> &'a mut [T] {
self.rem
}
}
@ -3308,7 +3313,7 @@ pub struct ChunkBy<'a, T: 'a, P> {
#[stable(feature = "slice_group_by", since = "1.77.0")]
impl<'a, T: 'a, P> ChunkBy<'a, T, P> {
pub(super) fn new(slice: &'a [T], predicate: P) -> Self {
pub(super) const fn new(slice: &'a [T], predicate: P) -> Self {
ChunkBy { slice, predicate }
}
}
@ -3395,7 +3400,7 @@ pub struct ChunkByMut<'a, T: 'a, P> {
#[stable(feature = "slice_group_by", since = "1.77.0")]
impl<'a, T: 'a, P> ChunkByMut<'a, T, P> {
pub(super) fn new(slice: &'a mut [T], predicate: P) -> Self {
pub(super) const fn new(slice: &'a mut [T], predicate: P) -> Self {
ChunkByMut { slice, predicate }
}
}

View file

@ -1043,9 +1043,10 @@ impl<T> [T] {
/// assert_eq!(iterator.next(), None);
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
#[rustc_diagnostic_item = "slice_iter"]
pub fn iter(&self) -> Iter<'_, T> {
pub const fn iter(&self) -> Iter<'_, T> {
Iter::new(self)
}
@ -1062,9 +1063,10 @@ impl<T> [T] {
/// }
/// assert_eq!(x, &[3, 4, 6]);
/// ```
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[stable(feature = "rust1", since = "1.0.0")]
#[inline]
pub fn iter_mut(&mut self) -> IterMut<'_, T> {
pub const fn iter_mut(&mut self) -> IterMut<'_, T> {
IterMut::new(self)
}
@ -1116,9 +1118,10 @@ impl<T> [T] {
/// assert_eq!(array, ['s', 't', ' ', '2', '0', '1', '5', 'u', 'R']);
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
#[track_caller]
pub fn windows(&self, size: usize) -> Windows<'_, T> {
pub const fn windows(&self, size: usize) -> Windows<'_, T> {
let size = NonZero::new(size).expect("window size must be non-zero");
Windows::new(self, size)
}
@ -1151,9 +1154,10 @@ impl<T> [T] {
/// [`chunks_exact`]: slice::chunks_exact
/// [`rchunks`]: slice::rchunks
#[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
#[track_caller]
pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T> {
pub const fn chunks(&self, chunk_size: usize) -> Chunks<'_, T> {
assert!(chunk_size != 0, "chunk size must be non-zero");
Chunks::new(self, chunk_size)
}
@ -1190,9 +1194,10 @@ impl<T> [T] {
/// [`chunks_exact_mut`]: slice::chunks_exact_mut
/// [`rchunks_mut`]: slice::rchunks_mut
#[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
#[track_caller]
pub fn chunks_mut(&mut self, chunk_size: usize) -> ChunksMut<'_, T> {
pub const fn chunks_mut(&mut self, chunk_size: usize) -> ChunksMut<'_, T> {
assert!(chunk_size != 0, "chunk size must be non-zero");
ChunksMut::new(self, chunk_size)
}
@ -1228,9 +1233,10 @@ impl<T> [T] {
/// [`chunks`]: slice::chunks
/// [`rchunks_exact`]: slice::rchunks_exact
#[stable(feature = "chunks_exact", since = "1.31.0")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
#[track_caller]
pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T> {
pub const fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T> {
assert!(chunk_size != 0, "chunk size must be non-zero");
ChunksExact::new(self, chunk_size)
}
@ -1271,9 +1277,10 @@ impl<T> [T] {
/// [`chunks_mut`]: slice::chunks_mut
/// [`rchunks_exact_mut`]: slice::rchunks_exact_mut
#[stable(feature = "chunks_exact", since = "1.31.0")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
#[track_caller]
pub fn chunks_exact_mut(&mut self, chunk_size: usize) -> ChunksExactMut<'_, T> {
pub const fn chunks_exact_mut(&mut self, chunk_size: usize) -> ChunksExactMut<'_, T> {
assert!(chunk_size != 0, "chunk size must be non-zero");
ChunksExactMut::new(self, chunk_size)
}
@ -1429,9 +1436,10 @@ impl<T> [T] {
///
/// [`chunks_exact`]: slice::chunks_exact
#[unstable(feature = "array_chunks", issue = "74985")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
#[track_caller]
pub fn array_chunks<const N: usize>(&self) -> ArrayChunks<'_, T, N> {
pub const fn array_chunks<const N: usize>(&self) -> ArrayChunks<'_, T, N> {
assert!(N != 0, "chunk size must be non-zero");
ArrayChunks::new(self)
}
@ -1592,9 +1600,10 @@ impl<T> [T] {
///
/// [`chunks_exact_mut`]: slice::chunks_exact_mut
#[unstable(feature = "array_chunks", issue = "74985")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
#[track_caller]
pub fn array_chunks_mut<const N: usize>(&mut self) -> ArrayChunksMut<'_, T, N> {
pub const fn array_chunks_mut<const N: usize>(&mut self) -> ArrayChunksMut<'_, T, N> {
assert!(N != 0, "chunk size must be non-zero");
ArrayChunksMut::new(self)
}
@ -1625,9 +1634,10 @@ impl<T> [T] {
///
/// [`windows`]: slice::windows
#[unstable(feature = "array_windows", issue = "75027")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
#[track_caller]
pub fn array_windows<const N: usize>(&self) -> ArrayWindows<'_, T, N> {
pub const fn array_windows<const N: usize>(&self) -> ArrayWindows<'_, T, N> {
assert!(N != 0, "window size must be non-zero");
ArrayWindows::new(self)
}
@ -1660,9 +1670,10 @@ impl<T> [T] {
/// [`rchunks_exact`]: slice::rchunks_exact
/// [`chunks`]: slice::chunks
#[stable(feature = "rchunks", since = "1.31.0")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
#[track_caller]
pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T> {
pub const fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T> {
assert!(chunk_size != 0, "chunk size must be non-zero");
RChunks::new(self, chunk_size)
}
@ -1699,9 +1710,10 @@ impl<T> [T] {
/// [`rchunks_exact_mut`]: slice::rchunks_exact_mut
/// [`chunks_mut`]: slice::chunks_mut
#[stable(feature = "rchunks", since = "1.31.0")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
#[track_caller]
pub fn rchunks_mut(&mut self, chunk_size: usize) -> RChunksMut<'_, T> {
pub const fn rchunks_mut(&mut self, chunk_size: usize) -> RChunksMut<'_, T> {
assert!(chunk_size != 0, "chunk size must be non-zero");
RChunksMut::new(self, chunk_size)
}
@ -1739,9 +1751,10 @@ impl<T> [T] {
/// [`rchunks`]: slice::rchunks
/// [`chunks_exact`]: slice::chunks_exact
#[stable(feature = "rchunks", since = "1.31.0")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
#[track_caller]
pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T> {
pub const fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T> {
assert!(chunk_size != 0, "chunk size must be non-zero");
RChunksExact::new(self, chunk_size)
}
@ -1783,9 +1796,10 @@ impl<T> [T] {
/// [`rchunks_mut`]: slice::rchunks_mut
/// [`chunks_exact_mut`]: slice::chunks_exact_mut
#[stable(feature = "rchunks", since = "1.31.0")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
#[track_caller]
pub fn rchunks_exact_mut(&mut self, chunk_size: usize) -> RChunksExactMut<'_, T> {
pub const fn rchunks_exact_mut(&mut self, chunk_size: usize) -> RChunksExactMut<'_, T> {
assert!(chunk_size != 0, "chunk size must be non-zero");
RChunksExactMut::new(self, chunk_size)
}
@ -1823,8 +1837,9 @@ impl<T> [T] {
/// assert_eq!(iter.next(), None);
/// ```
#[stable(feature = "slice_group_by", since = "1.77.0")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
pub fn chunk_by<F>(&self, pred: F) -> ChunkBy<'_, T, F>
pub const fn chunk_by<F>(&self, pred: F) -> ChunkBy<'_, T, F>
where
F: FnMut(&T, &T) -> bool,
{
@ -1864,8 +1879,9 @@ impl<T> [T] {
/// assert_eq!(iter.next(), None);
/// ```
#[stable(feature = "slice_group_by", since = "1.77.0")]
#[rustc_const_unstable(feature = "const_slice_make_iter", issue = "137737")]
#[inline]
pub fn chunk_by_mut<F>(&mut self, pred: F) -> ChunkByMut<'_, T, F>
pub const fn chunk_by_mut<F>(&mut self, pred: F) -> ChunkByMut<'_, T, F>
where
F: FnMut(&T, &T) -> bool,
{

View file

@ -22,74 +22,74 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
debug i => _33;
debug x => _34;
}
scope 19 (inlined <Enumerate<std::slice::Iter<'_, T>> as Iterator>::next) {
scope 18 (inlined <Enumerate<std::slice::Iter<'_, T>> as Iterator>::next) {
let mut _27: std::option::Option<&T>;
let mut _30: (usize, bool);
let mut _31: (usize, &T);
scope 20 {
scope 19 {
let _29: usize;
scope 25 {
}
}
scope 21 {
scope 22 {
scope 28 (inlined <Option<(usize, &T)> as FromResidual<Option<Infallible>>>::from_residual) {
}
}
}
scope 23 {
scope 24 {
}
}
scope 26 (inlined <Option<&T> as Try>::branch) {
let _28: &T;
scope 27 {
scope 20 {
scope 21 {
scope 27 (inlined <Option<(usize, &T)> as FromResidual<Option<Infallible>>>::from_residual) {
}
}
}
scope 29 (inlined <std::slice::Iter<'_, T> as Iterator>::next) {
scope 22 {
scope 23 {
}
}
scope 25 (inlined <Option<&T> as Try>::branch) {
let _28: &T;
scope 26 {
}
}
scope 28 (inlined <std::slice::Iter<'_, T> as Iterator>::next) {
let _14: std::ptr::NonNull<T>;
let _16: std::ptr::NonNull<T>;
let mut _19: bool;
let mut _22: std::ptr::NonNull<T>;
let mut _24: usize;
let _26: &T;
scope 30 {
scope 29 {
let _15: *const T;
scope 31 {
scope 30 {
let _23: usize;
scope 32 {
scope 35 (inlined core::num::<impl usize>::unchecked_sub) {
scope 36 (inlined core::ub_checks::check_language_ub) {
scope 37 (inlined core::ub_checks::check_language_ub::runtime) {
scope 31 {
scope 34 (inlined core::num::<impl usize>::unchecked_sub) {
scope 35 (inlined core::ub_checks::check_language_ub) {
scope 36 (inlined core::ub_checks::check_language_ub::runtime) {
}
}
}
scope 38 (inlined without_provenance_mut::<T>) {
scope 37 (inlined without_provenance_mut::<T>) {
}
}
scope 33 (inlined std::ptr::const_ptr::<impl *const T>::addr) {
scope 34 (inlined std::ptr::const_ptr::<impl *const T>::cast::<()>) {
scope 32 (inlined std::ptr::const_ptr::<impl *const T>::addr) {
scope 33 (inlined std::ptr::const_ptr::<impl *const T>::cast::<()>) {
}
}
scope 39 (inlined <NonNull<T> as PartialEq>::eq) {
scope 38 (inlined <NonNull<T> as PartialEq>::eq) {
let mut _17: *mut T;
let mut _18: *mut T;
scope 39 (inlined NonNull::<T>::as_ptr) {
}
scope 40 (inlined NonNull::<T>::as_ptr) {
}
scope 41 (inlined NonNull::<T>::as_ptr) {
}
}
scope 42 (inlined NonNull::<T>::add) {
scope 41 (inlined NonNull::<T>::add) {
let mut _20: *const T;
let mut _21: *const T;
scope 43 (inlined NonNull::<T>::as_ptr) {
scope 42 (inlined NonNull::<T>::as_ptr) {
}
}
scope 44 (inlined NonNull::<T>::as_ref::<'_>) {
scope 43 (inlined NonNull::<T>::as_ref::<'_>) {
let _25: *const T;
scope 45 (inlined NonNull::<T>::as_ptr) {
scope 44 (inlined NonNull::<T>::as_ptr) {
}
scope 46 (inlined std::ptr::mut_ptr::<impl *mut T>::cast_const) {
scope 45 (inlined std::ptr::mut_ptr::<impl *mut T>::cast_const) {
}
}
}
@ -109,33 +109,31 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
let _9: *const T;
scope 7 {
}
scope 12 (inlined std::ptr::without_provenance::<T>) {
scope 13 (inlined without_provenance_mut::<T>) {
scope 11 (inlined std::ptr::without_provenance::<T>) {
scope 12 (inlined without_provenance_mut::<T>) {
}
}
scope 14 (inlined NonNull::<T>::as_ptr) {
scope 13 (inlined NonNull::<T>::as_ptr) {
}
scope 15 (inlined std::ptr::mut_ptr::<impl *mut T>::add) {
scope 14 (inlined std::ptr::mut_ptr::<impl *mut T>::add) {
}
}
scope 8 (inlined <NonNull<[T]> as From<&[T]>>::from) {
scope 9 (inlined NonNull::<[T]>::from_ref) {
let mut _4: *const [T];
}
scope 8 (inlined NonNull::<[T]>::from_ref) {
let mut _4: *const [T];
}
scope 10 (inlined NonNull::<[T]>::cast::<T>) {
scope 9 (inlined NonNull::<[T]>::cast::<T>) {
let mut _5: *const T;
scope 11 (inlined NonNull::<[T]>::as_ptr) {
scope 10 (inlined NonNull::<[T]>::as_ptr) {
}
}
}
}
}
scope 16 (inlined <std::slice::Iter<'_, T> as Iterator>::enumerate) {
scope 17 (inlined Enumerate::<std::slice::Iter<'_, T>>::new) {
scope 15 (inlined <std::slice::Iter<'_, T> as Iterator>::enumerate) {
scope 16 (inlined Enumerate::<std::slice::Iter<'_, T>>::new) {
}
}
scope 18 (inlined <Enumerate<std::slice::Iter<'_, T>> as IntoIterator>::into_iter) {
scope 17 (inlined <Enumerate<std::slice::Iter<'_, T>> as IntoIterator>::into_iter) {
}
bb0: {

View file

@ -34,33 +34,31 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
let _9: *const T;
scope 7 {
}
scope 12 (inlined std::ptr::without_provenance::<T>) {
scope 13 (inlined without_provenance_mut::<T>) {
scope 11 (inlined std::ptr::without_provenance::<T>) {
scope 12 (inlined without_provenance_mut::<T>) {
}
}
scope 14 (inlined NonNull::<T>::as_ptr) {
scope 13 (inlined NonNull::<T>::as_ptr) {
}
scope 15 (inlined std::ptr::mut_ptr::<impl *mut T>::add) {
scope 14 (inlined std::ptr::mut_ptr::<impl *mut T>::add) {
}
}
scope 8 (inlined <NonNull<[T]> as From<&[T]>>::from) {
scope 9 (inlined NonNull::<[T]>::from_ref) {
let mut _4: *const [T];
}
scope 8 (inlined NonNull::<[T]>::from_ref) {
let mut _4: *const [T];
}
scope 10 (inlined NonNull::<[T]>::cast::<T>) {
scope 9 (inlined NonNull::<[T]>::cast::<T>) {
let mut _5: *const T;
scope 11 (inlined NonNull::<[T]>::as_ptr) {
scope 10 (inlined NonNull::<[T]>::as_ptr) {
}
}
}
}
}
scope 16 (inlined <std::slice::Iter<'_, T> as Iterator>::enumerate) {
scope 17 (inlined Enumerate::<std::slice::Iter<'_, T>>::new) {
scope 15 (inlined <std::slice::Iter<'_, T> as Iterator>::enumerate) {
scope 16 (inlined Enumerate::<std::slice::Iter<'_, T>>::new) {
}
}
scope 18 (inlined <Enumerate<std::slice::Iter<'_, T>> as IntoIterator>::into_iter) {
scope 17 (inlined <Enumerate<std::slice::Iter<'_, T>> as IntoIterator>::into_iter) {
}
bb0: {

View file

@ -18,50 +18,50 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
scope 2 {
debug x => _27;
}
scope 17 (inlined <std::slice::Iter<'_, T> as Iterator>::next) {
scope 16 (inlined <std::slice::Iter<'_, T> as Iterator>::next) {
let _13: std::ptr::NonNull<T>;
let _15: std::ptr::NonNull<T>;
let mut _18: bool;
let mut _21: std::ptr::NonNull<T>;
let mut _23: usize;
let _25: &T;
scope 18 {
scope 17 {
let _14: *const T;
scope 19 {
scope 18 {
let _22: usize;
scope 20 {
scope 23 (inlined core::num::<impl usize>::unchecked_sub) {
scope 24 (inlined core::ub_checks::check_language_ub) {
scope 25 (inlined core::ub_checks::check_language_ub::runtime) {
scope 19 {
scope 22 (inlined core::num::<impl usize>::unchecked_sub) {
scope 23 (inlined core::ub_checks::check_language_ub) {
scope 24 (inlined core::ub_checks::check_language_ub::runtime) {
}
}
}
scope 26 (inlined without_provenance_mut::<T>) {
scope 25 (inlined without_provenance_mut::<T>) {
}
}
scope 21 (inlined std::ptr::const_ptr::<impl *const T>::addr) {
scope 22 (inlined std::ptr::const_ptr::<impl *const T>::cast::<()>) {
scope 20 (inlined std::ptr::const_ptr::<impl *const T>::addr) {
scope 21 (inlined std::ptr::const_ptr::<impl *const T>::cast::<()>) {
}
}
scope 27 (inlined <NonNull<T> as PartialEq>::eq) {
scope 26 (inlined <NonNull<T> as PartialEq>::eq) {
let mut _16: *mut T;
let mut _17: *mut T;
scope 27 (inlined NonNull::<T>::as_ptr) {
}
scope 28 (inlined NonNull::<T>::as_ptr) {
}
scope 29 (inlined NonNull::<T>::as_ptr) {
}
}
scope 30 (inlined NonNull::<T>::add) {
scope 29 (inlined NonNull::<T>::add) {
let mut _19: *const T;
let mut _20: *const T;
scope 31 (inlined NonNull::<T>::as_ptr) {
scope 30 (inlined NonNull::<T>::as_ptr) {
}
}
scope 32 (inlined NonNull::<T>::as_ref::<'_>) {
scope 31 (inlined NonNull::<T>::as_ref::<'_>) {
let _24: *const T;
scope 33 (inlined NonNull::<T>::as_ptr) {
scope 32 (inlined NonNull::<T>::as_ptr) {
}
scope 34 (inlined std::ptr::mut_ptr::<impl *mut T>::cast_const) {
scope 33 (inlined std::ptr::mut_ptr::<impl *mut T>::cast_const) {
}
}
}
@ -80,29 +80,27 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
let _9: *const T;
scope 7 {
}
scope 12 (inlined std::ptr::without_provenance::<T>) {
scope 13 (inlined without_provenance_mut::<T>) {
scope 11 (inlined std::ptr::without_provenance::<T>) {
scope 12 (inlined without_provenance_mut::<T>) {
}
}
scope 14 (inlined NonNull::<T>::as_ptr) {
scope 13 (inlined NonNull::<T>::as_ptr) {
}
scope 15 (inlined std::ptr::mut_ptr::<impl *mut T>::add) {
scope 14 (inlined std::ptr::mut_ptr::<impl *mut T>::add) {
}
}
scope 8 (inlined <NonNull<[T]> as From<&[T]>>::from) {
scope 9 (inlined NonNull::<[T]>::from_ref) {
let mut _4: *const [T];
}
scope 8 (inlined NonNull::<[T]>::from_ref) {
let mut _4: *const [T];
}
scope 10 (inlined NonNull::<[T]>::cast::<T>) {
scope 9 (inlined NonNull::<[T]>::cast::<T>) {
let mut _5: *const T;
scope 11 (inlined NonNull::<[T]>::as_ptr) {
scope 10 (inlined NonNull::<[T]>::as_ptr) {
}
}
}
}
}
scope 16 (inlined <std::slice::Iter<'_, T> as IntoIterator>::into_iter) {
scope 15 (inlined <std::slice::Iter<'_, T> as IntoIterator>::into_iter) {
}
bb0: {

View file

@ -18,50 +18,50 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
scope 2 {
debug x => _27;
}
scope 17 (inlined <std::slice::Iter<'_, T> as Iterator>::next) {
scope 16 (inlined <std::slice::Iter<'_, T> as Iterator>::next) {
let _13: std::ptr::NonNull<T>;
let _15: std::ptr::NonNull<T>;
let mut _18: bool;
let mut _21: std::ptr::NonNull<T>;
let mut _23: usize;
let _25: &T;
scope 18 {
scope 17 {
let _14: *const T;
scope 19 {
scope 18 {
let _22: usize;
scope 20 {
scope 23 (inlined core::num::<impl usize>::unchecked_sub) {
scope 24 (inlined core::ub_checks::check_language_ub) {
scope 25 (inlined core::ub_checks::check_language_ub::runtime) {
scope 19 {
scope 22 (inlined core::num::<impl usize>::unchecked_sub) {
scope 23 (inlined core::ub_checks::check_language_ub) {
scope 24 (inlined core::ub_checks::check_language_ub::runtime) {
}
}
}
scope 26 (inlined without_provenance_mut::<T>) {
scope 25 (inlined without_provenance_mut::<T>) {
}
}
scope 21 (inlined std::ptr::const_ptr::<impl *const T>::addr) {
scope 22 (inlined std::ptr::const_ptr::<impl *const T>::cast::<()>) {
scope 20 (inlined std::ptr::const_ptr::<impl *const T>::addr) {
scope 21 (inlined std::ptr::const_ptr::<impl *const T>::cast::<()>) {
}
}
scope 27 (inlined <NonNull<T> as PartialEq>::eq) {
scope 26 (inlined <NonNull<T> as PartialEq>::eq) {
let mut _16: *mut T;
let mut _17: *mut T;
scope 27 (inlined NonNull::<T>::as_ptr) {
}
scope 28 (inlined NonNull::<T>::as_ptr) {
}
scope 29 (inlined NonNull::<T>::as_ptr) {
}
}
scope 30 (inlined NonNull::<T>::add) {
scope 29 (inlined NonNull::<T>::add) {
let mut _19: *const T;
let mut _20: *const T;
scope 31 (inlined NonNull::<T>::as_ptr) {
scope 30 (inlined NonNull::<T>::as_ptr) {
}
}
scope 32 (inlined NonNull::<T>::as_ref::<'_>) {
scope 31 (inlined NonNull::<T>::as_ref::<'_>) {
let _24: *const T;
scope 33 (inlined NonNull::<T>::as_ptr) {
scope 32 (inlined NonNull::<T>::as_ptr) {
}
scope 34 (inlined std::ptr::mut_ptr::<impl *mut T>::cast_const) {
scope 33 (inlined std::ptr::mut_ptr::<impl *mut T>::cast_const) {
}
}
}
@ -80,29 +80,27 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
let _9: *const T;
scope 7 {
}
scope 12 (inlined std::ptr::without_provenance::<T>) {
scope 13 (inlined without_provenance_mut::<T>) {
scope 11 (inlined std::ptr::without_provenance::<T>) {
scope 12 (inlined without_provenance_mut::<T>) {
}
}
scope 14 (inlined NonNull::<T>::as_ptr) {
scope 13 (inlined NonNull::<T>::as_ptr) {
}
scope 15 (inlined std::ptr::mut_ptr::<impl *mut T>::add) {
scope 14 (inlined std::ptr::mut_ptr::<impl *mut T>::add) {
}
}
scope 8 (inlined <NonNull<[T]> as From<&[T]>>::from) {
scope 9 (inlined NonNull::<[T]>::from_ref) {
let mut _4: *const [T];
}
scope 8 (inlined NonNull::<[T]>::from_ref) {
let mut _4: *const [T];
}
scope 10 (inlined NonNull::<[T]>::cast::<T>) {
scope 9 (inlined NonNull::<[T]>::cast::<T>) {
let mut _5: *const T;
scope 11 (inlined NonNull::<[T]>::as_ptr) {
scope 10 (inlined NonNull::<[T]>::as_ptr) {
}
}
}
}
}
scope 16 (inlined <std::slice::Iter<'_, T> as IntoIterator>::into_iter) {
scope 15 (inlined <std::slice::Iter<'_, T> as IntoIterator>::into_iter) {
}
bb0: {

View file

@ -18,7 +18,7 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
scope 2 {
debug x => _17;
}
scope 19 (inlined <Rev<std::slice::Iter<'_, T>> as Iterator>::next) {
scope 18 (inlined <Rev<std::slice::Iter<'_, T>> as Iterator>::next) {
let mut _14: &mut std::slice::Iter<'_, T>;
}
}
@ -34,33 +34,31 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
let _9: *const T;
scope 7 {
}
scope 12 (inlined std::ptr::without_provenance::<T>) {
scope 13 (inlined without_provenance_mut::<T>) {
scope 11 (inlined std::ptr::without_provenance::<T>) {
scope 12 (inlined without_provenance_mut::<T>) {
}
}
scope 14 (inlined NonNull::<T>::as_ptr) {
scope 13 (inlined NonNull::<T>::as_ptr) {
}
scope 15 (inlined std::ptr::mut_ptr::<impl *mut T>::add) {
scope 14 (inlined std::ptr::mut_ptr::<impl *mut T>::add) {
}
}
scope 8 (inlined <NonNull<[T]> as From<&[T]>>::from) {
scope 9 (inlined NonNull::<[T]>::from_ref) {
let mut _4: *const [T];
}
scope 8 (inlined NonNull::<[T]>::from_ref) {
let mut _4: *const [T];
}
scope 10 (inlined NonNull::<[T]>::cast::<T>) {
scope 9 (inlined NonNull::<[T]>::cast::<T>) {
let mut _5: *const T;
scope 11 (inlined NonNull::<[T]>::as_ptr) {
scope 10 (inlined NonNull::<[T]>::as_ptr) {
}
}
}
}
}
scope 16 (inlined <std::slice::Iter<'_, T> as Iterator>::rev) {
scope 17 (inlined Rev::<std::slice::Iter<'_, T>>::new) {
scope 15 (inlined <std::slice::Iter<'_, T> as Iterator>::rev) {
scope 16 (inlined Rev::<std::slice::Iter<'_, T>>::new) {
}
}
scope 18 (inlined <Rev<std::slice::Iter<'_, T>> as IntoIterator>::into_iter) {
scope 17 (inlined <Rev<std::slice::Iter<'_, T>> as IntoIterator>::into_iter) {
}
bb0: {

View file

@ -18,7 +18,7 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
scope 2 {
debug x => _17;
}
scope 19 (inlined <Rev<std::slice::Iter<'_, T>> as Iterator>::next) {
scope 18 (inlined <Rev<std::slice::Iter<'_, T>> as Iterator>::next) {
let mut _14: &mut std::slice::Iter<'_, T>;
}
}
@ -34,33 +34,31 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
let _9: *const T;
scope 7 {
}
scope 12 (inlined std::ptr::without_provenance::<T>) {
scope 13 (inlined without_provenance_mut::<T>) {
scope 11 (inlined std::ptr::without_provenance::<T>) {
scope 12 (inlined without_provenance_mut::<T>) {
}
}
scope 14 (inlined NonNull::<T>::as_ptr) {
scope 13 (inlined NonNull::<T>::as_ptr) {
}
scope 15 (inlined std::ptr::mut_ptr::<impl *mut T>::add) {
scope 14 (inlined std::ptr::mut_ptr::<impl *mut T>::add) {
}
}
scope 8 (inlined <NonNull<[T]> as From<&[T]>>::from) {
scope 9 (inlined NonNull::<[T]>::from_ref) {
let mut _4: *const [T];
}
scope 8 (inlined NonNull::<[T]>::from_ref) {
let mut _4: *const [T];
}
scope 10 (inlined NonNull::<[T]>::cast::<T>) {
scope 9 (inlined NonNull::<[T]>::cast::<T>) {
let mut _5: *const T;
scope 11 (inlined NonNull::<[T]>::as_ptr) {
scope 10 (inlined NonNull::<[T]>::as_ptr) {
}
}
}
}
}
scope 16 (inlined <std::slice::Iter<'_, T> as Iterator>::rev) {
scope 17 (inlined Rev::<std::slice::Iter<'_, T>>::new) {
scope 15 (inlined <std::slice::Iter<'_, T> as Iterator>::rev) {
scope 16 (inlined Rev::<std::slice::Iter<'_, T>>::new) {
}
}
scope 18 (inlined <Rev<std::slice::Iter<'_, T>> as IntoIterator>::into_iter) {
scope 17 (inlined <Rev<std::slice::Iter<'_, T>> as IntoIterator>::into_iter) {
}
bb0: {