// WARNING: This is highly experimental output it's intended for stable-mir developers only.
// If you find a bug or want to improve the output open a issue at https://github.com/rust-lang/project-stable-mir.
fn foo(_1: i32) -> i32 {
    let mut _0: i32;
    let mut _2: (i32, bool);
    debug i => _1;
    bb0: {
        _2 = CheckedAdd(_1, 1_i32);
        assert(!move (_2.1: bool), "attempt to compute `{} + {}`, which would overflow", _1, 1_i32) -> [success: bb1, unwind continue];
    }
    bb1: {
        _0 = move (_2.0: i32);
        return;
    }
}
fn bar(_1: &mut Vec<i32>) -> Vec<i32> {
    let mut _0: Vec<i32>;
    let mut _2: Vec<i32>;
    let mut _3: &Vec<i32>;
    let  _4: ();
    let mut _5: &mut Vec<i32>;
    debug vec => _1;
    debug new_vec => _2;
    bb0: {
        _3 = &(*_1);
        _2 = <Vec<i32> as Clone>::clone(move _3) -> [return: bb1, unwind continue];
    }
    bb1: {
        _5 = &mut _2;
        _4 = Vec::<i32>::push(move _5, 1_i32) -> [return: bb2, unwind: bb3];
    }
    bb2: {
        _0 = move _2;
        return;
    }
    bb3: {
        drop(_2) -> [return: bb4, unwind terminate];
    }
    bb4: {
        resume;
    }
}
fn demux(_1: u8) -> u8 {
    let mut _0: u8;
    debug input => _1;
    bb0: {
        switchInt(_1) -> [0: bb4, 1: bb3, 2: bb2, otherwise: bb1];
    }
    bb1: {
        _0 = 0_u8;
        goto -> bb5;
    }
    bb2: {
        _0 = 8_u8;
        goto -> bb5;
    }
    bb3: {
        _0 = 6_u8;
        goto -> bb5;
    }
    bb4: {
        _0 = 10_u8;
        goto -> bb5;
    }
    bb5: {
        return;
    }
}
fn main() -> () {
    let mut _0: ();
    bb0: {
        return;
    }
}
