// MIR for `range_loop` after runtime-optimized

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 unreachable];
    }

    bb3: {
        return;
    }

    bb4: {
        StorageLive(_7);
        _7 = copy _4;
        _4 = AddUnchecked(copy _7, const 1_usize);
        _8 = Option::<usize>::Some(copy _7);
        StorageDead(_7);
        StorageDead(_6);
        StorageLive(_9);
        _9 = copy ((_8 as Some).0: usize);
        StorageLive(_11);
        _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 unreachable];
    }

    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 unreachable];
    }

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