// MIR for `forward_loop` after PreCodegen

fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
    debug slice => _1;
    debug f => _2;
    let mut _0: ();
    let mut _22: std::option::Option<&T>;
    let mut _24: &impl Fn(&T);
    let mut _25: (&T,);
    let _26: ();
    scope 1 {
        debug ((iter: std::slice::Iter<'_, T>).0: std::ptr::NonNull<T>) => _6;
        debug ((iter: std::slice::Iter<'_, T>).1: *const T) => _9;
        debug ((iter: std::slice::Iter<'_, T>).2: std::marker::PhantomData<&T>) => const ZeroSized: PhantomData<&T>;
        let _23: &T;
        scope 2 {
            debug x => _23;
        }
        scope 16 (inlined <std::slice::Iter<'_, T> as Iterator>::next) {
            let mut _6: std::ptr::NonNull<T>;
            let _10: std::ptr::NonNull<T>;
            let _12: std::ptr::NonNull<T>;
            let mut _15: bool;
            let mut _19: usize;
            let _21: &T;
            scope 17 {
                let _11: *const T;
                scope 18 {
                    let _18: usize;
                    scope 19 {
                        scope 22 (inlined #[track_caller] 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 25 (inlined without_provenance_mut::<T>) {
                        }
                    }
                    scope 20 (inlined std::ptr::const_ptr::<impl *const T>::addr) {
                        scope 21 (inlined std::ptr::const_ptr::<impl *const T>::cast::<()>) {
                        }
                    }
                    scope 26 (inlined <NonNull<T> as PartialEq>::eq) {
                        let mut _13: *mut T;
                        let mut _14: *mut T;
                        scope 27 (inlined NonNull::<T>::as_ptr) {
                        }
                        scope 28 (inlined NonNull::<T>::as_ptr) {
                        }
                    }
                    scope 29 (inlined NonNull::<T>::add) {
                        let mut _16: *const T;
                        let mut _17: *const T;
                        scope 30 (inlined NonNull::<T>::as_ptr) {
                        }
                    }
                    scope 31 (inlined NonNull::<T>::as_ref::<'_>) {
                        let _20: *const T;
                        scope 32 (inlined NonNull::<T>::as_ptr) {
                        }
                        scope 33 (inlined std::ptr::mut_ptr::<impl *mut T>::cast_const) {
                        }
                    }
                }
            }
        }
    }
    scope 3 (inlined core::slice::<impl [T]>::iter) {
        scope 4 (inlined std::slice::Iter::<'_, T>::new) {
            let _3: usize;
            let mut _7: *mut T;
            let mut _8: *mut T;
            scope 5 {
                scope 6 {
                    let _9: *const T;
                    scope 7 {
                    }
                    scope 11 (inlined std::ptr::without_provenance::<T>) {
                        scope 12 (inlined without_provenance_mut::<T>) {
                        }
                    }
                    scope 13 (inlined NonNull::<T>::as_ptr) {
                    }
                    scope 14 (inlined #[track_caller] std::ptr::mut_ptr::<impl *mut T>::add) {
                    }
                }
                scope 8 (inlined NonNull::<[T]>::from_ref) {
                    let mut _4: *const [T];
                }
                scope 9 (inlined NonNull::<[T]>::cast::<T>) {
                    let mut _5: *const T;
                    scope 10 (inlined NonNull::<[T]>::as_ptr) {
                    }
                }
            }
        }
    }
    scope 15 (inlined <std::slice::Iter<'_, T> as IntoIterator>::into_iter) {
    }

    bb0: {
        StorageLive(_3);
        StorageLive(_4);
        _3 = PtrMetadata(copy _1);
        _4 = &raw const (*_1);
        StorageLive(_5);
        _5 = copy _4 as *const T (PtrToPtr);
        _6 = NonNull::<T> { pointer: copy _5 };
        StorageDead(_5);
        switchInt(const <T as std::mem::SizedTypeProperties>::IS_ZST) -> [0: bb1, otherwise: bb2];
    }

    bb1: {
        StorageLive(_8);
        StorageLive(_7);
        _7 = copy _4 as *mut T (PtrToPtr);
        _8 = Offset(copy _7, copy _3);
        StorageDead(_7);
        _9 = copy _8 as *const T (PtrToPtr);
        StorageDead(_8);
        goto -> bb3;
    }

    bb2: {
        _9 = copy _3 as *const T (Transmute);
        goto -> bb3;
    }

    bb3: {
        StorageDead(_4);
        StorageDead(_3);
        goto -> bb4;
    }

    bb4: {
        StorageLive(_22);
        StorageLive(_10);
        StorageLive(_11);
        StorageLive(_18);
        StorageLive(_19);
        StorageLive(_12);
        StorageLive(_21);
        _10 = copy _6;
        _11 = copy _9;
        switchInt(const <T as std::mem::SizedTypeProperties>::IS_ZST) -> [0: bb5, otherwise: bb8];
    }

    bb5: {
        StorageLive(_15);
        _12 = copy _11 as std::ptr::NonNull<T> (Transmute);
        StorageLive(_13);
        _13 = copy _10 as *mut T (Transmute);
        StorageLive(_14);
        _14 = copy _12 as *mut T (Transmute);
        _15 = Eq(copy _13, copy _14);
        StorageDead(_14);
        StorageDead(_13);
        switchInt(move _15) -> [0: bb6, otherwise: bb7];
    }

    bb6: {
        StorageDead(_15);
        StorageLive(_17);
        StorageLive(_16);
        _16 = copy _10 as *const T (Transmute);
        _17 = Offset(copy _16, const 1_usize);
        StorageDead(_16);
        _6 = NonNull::<T> { pointer: copy _17 };
        StorageDead(_17);
        goto -> bb13;
    }

    bb7: {
        StorageDead(_15);
        goto -> bb10;
    }

    bb8: {
        _18 = copy _11 as usize (Transmute);
        switchInt(copy _18) -> [0: bb9, otherwise: bb12];
    }

    bb9: {
        goto -> bb10;
    }

    bb10: {
        StorageDead(_21);
        StorageDead(_12);
        StorageDead(_19);
        StorageDead(_18);
        StorageDead(_11);
        StorageDead(_10);
        StorageDead(_22);
        drop(_2) -> [return: bb11, unwind unreachable];
    }

    bb11: {
        return;
    }

    bb12: {
        _19 = SubUnchecked(copy _18, const 1_usize);
        _9 = copy _19 as *const T (Transmute);
        goto -> bb13;
    }

    bb13: {
        StorageLive(_20);
        _20 = copy _10 as *const T (Transmute);
        _21 = &(*_20);
        StorageDead(_20);
        _22 = Option::<&T>::Some(copy _21);
        StorageDead(_21);
        StorageDead(_12);
        StorageDead(_19);
        StorageDead(_18);
        StorageDead(_11);
        StorageDead(_10);
        _23 = copy ((_22 as Some).0: &T);
        StorageLive(_24);
        _24 = &_2;
        StorageLive(_25);
        _25 = (copy _23,);
        _26 = <impl Fn(&T) as Fn<(&T,)>>::call(move _24, move _25) -> [return: bb14, unwind unreachable];
    }

    bb14: {
        StorageDead(_25);
        StorageDead(_24);
        StorageDead(_22);
        goto -> bb4;
    }
}
