// MIR for `range_loop` after PreCodegen

fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
    debug slice => _1;
    debug f => _2;
    let mut _0: ();
    let mut _3: usize;
    let mut _8: std::option::Option<usize>;
    let mut _10: bool;
    let mut _12: &impl Fn(usize, &T);
    let mut _13: (usize, &T);
    let _14: ();
    scope 1 {
        debug ((iter: std::ops::Range<usize>).0: usize) => _4;
        debug ((iter: std::ops::Range<usize>).1: usize) => _3;
        let _9: usize;
        scope 2 {
            debug i => _9;
            let _11: &T;
            scope 3 {
                debug x => _11;
            }
        }
        scope 5 (inlined iter::range::<impl Iterator for std::ops::Range<usize>>::next) {
            scope 6 (inlined <std::ops::Range<usize> as iter::range::RangeIteratorImpl>::spec_next) {
                let mut _4: usize;
                let mut _6: bool;
                let _7: usize;
                scope 7 {
                    scope 9 (inlined <usize as Step>::forward_unchecked) {
                        scope 10 (inlined #[track_caller] core::num::<impl usize>::unchecked_add) {
                            scope 11 (inlined core::ub_checks::check_language_ub) {
                                scope 12 (inlined core::ub_checks::check_language_ub::runtime) {
                                }
                            }
                        }
                    }
                }
                scope 8 (inlined std::cmp::impls::<impl PartialOrd for usize>::lt) {
                    let mut _5: usize;
                }
            }
        }
    }
    scope 4 (inlined <std::ops::Range<usize> as IntoIterator>::into_iter) {
    }

    bb0: {
        _3 = PtrMetadata(copy _1);
        _4 = const 0_usize;
        goto -> bb1;
    }

    bb1: {
        StorageLive(_8);
        StorageLive(_6);
        StorageLive(_5);
        _5 = copy _4;
        _6 = Lt(move _5, copy _3);
        StorageDead(_5);
        switchInt(move _6) -> [0: bb2, otherwise: bb4];
    }

    bb2: {
        StorageDead(_6);
        StorageDead(_8);
        drop(_2) -> [return: bb3, unwind continue];
    }

    bb3: {
        return;
    }

    bb4: {
        _7 = copy _4;
        _4 = AddUnchecked(copy _7, const 1_usize);
        _8 = Option::<usize>::Some(copy _7);
        StorageDead(_6);
        _9 = copy ((_8 as Some).0: usize);
        _10 = Lt(copy _9, copy _3);
        assert(move _10, "index out of bounds: the length is {} but the index is {}", copy _3, copy _9) -> [success: bb5, unwind: bb7];
    }

    bb5: {
        _11 = &(*_1)[_9];
        StorageLive(_12);
        _12 = &_2;
        StorageLive(_13);
        _13 = (copy _9, copy _11);
        _14 = <impl Fn(usize, &T) as Fn<(usize, &T)>>::call(move _12, move _13) -> [return: bb6, unwind: bb7];
    }

    bb6: {
        StorageDead(_13);
        StorageDead(_12);
        StorageDead(_8);
        goto -> bb1;
    }

    bb7 (cleanup): {
        drop(_2) -> [return: bb8, unwind terminate(cleanup)];
    }

    bb8 (cleanup): {
        resume;
    }
}
