// MIR for `main::{closure#0}` 0 generator_resume
/* generator_layout = GeneratorLayout {
    field_tys: {},
    variant_fields: {
        Unresumed(0): [],
        Returned (1): [],
        Panicked (2): [],
        Suspend0 (3): [],
    },
    storage_conflicts: BitMatrix(0x0) {},
} */

fn main::{closure#0}(_1: Pin<&mut [generator@$DIR/generator-tiny.rs:19:16: 25:6 {u8, HasDrop, ()}]>, _2: u8) -> GeneratorState<(), ()> {
    debug _x => _10;                     // in scope 0 at $DIR/generator-tiny.rs:19:17: 19:19
    let mut _0: std::ops::GeneratorState<(), ()>; // return place in scope 0 at $DIR/generator-tiny.rs:19:16: 25:6
    let _3: HasDrop;                     // in scope 0 at $DIR/generator-tiny.rs:20:13: 20:15
    let mut _4: !;                       // in scope 0 at $DIR/generator-tiny.rs:21:9: 24:10
    let mut _5: ();                      // in scope 0 at $DIR/generator-tiny.rs:19:16: 25:6
    let _6: u8;                          // in scope 0 at $DIR/generator-tiny.rs:22:13: 22:18
    let mut _7: ();                      // in scope 0 at $DIR/generator-tiny.rs:22:13: 22:18
    let _8: ();                          // in scope 0 at $DIR/generator-tiny.rs:23:13: 23:21
    let mut _9: ();                      // in scope 0 at $DIR/generator-tiny.rs:19:25: 19:25
    let _10: u8;                         // in scope 0 at $DIR/generator-tiny.rs:19:17: 19:19
    let mut _11: u32;                    // in scope 0 at $DIR/generator-tiny.rs:19:16: 25:6
    scope 1 {
        debug _d => _3;                  // in scope 1 at $DIR/generator-tiny.rs:20:13: 20:15
    }

    bb0: {
        _11 = discriminant((*(_1.0: &mut [generator@$DIR/generator-tiny.rs:19:16: 25:6 {u8, HasDrop, ()}]))); // scope 0 at $DIR/generator-tiny.rs:19:16: 25:6
        switchInt(move _11) -> [0_u32: bb1, 3_u32: bb5, otherwise: bb6]; // scope 0 at $DIR/generator-tiny.rs:19:16: 25:6
    }

    bb1: {
        _10 = move _2;                   // scope 0 at $DIR/generator-tiny.rs:19:16: 25:6
        StorageLive(_3);                 // scope 0 at $DIR/generator-tiny.rs:20:13: 20:15
        StorageLive(_4);                 // scope 1 at $DIR/generator-tiny.rs:21:9: 24:10
        goto -> bb2;                     // scope 1 at $DIR/generator-tiny.rs:21:9: 24:10
    }

    bb2: {
        StorageLive(_6);                 // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
        StorageLive(_7);                 // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
        ((_0 as Yielded).0: ()) = move _7; // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
        discriminant(_0) = 0;            // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
        discriminant((*(_1.0: &mut [generator@$DIR/generator-tiny.rs:19:16: 25:6 {u8, HasDrop, ()}]))) = 3; // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
        return;                          // scope 1 at $DIR/generator-tiny.rs:22:13: 22:18
    }

    bb3: {
        StorageDead(_7);                 // scope 1 at $DIR/generator-tiny.rs:22:17: 22:18
        StorageDead(_6);                 // scope 1 at $DIR/generator-tiny.rs:22:18: 22:19
        StorageLive(_8);                 // scope 1 at $DIR/generator-tiny.rs:23:13: 23:21
        _8 = callee() -> bb4;            // scope 1 at $DIR/generator-tiny.rs:23:13: 23:21
                                         // mir::Constant
                                         // + span: $DIR/generator-tiny.rs:23:13: 23:19
                                         // + literal: Const { ty: fn() {callee}, val: Value(Scalar(<ZST>)) }
    }

    bb4: {
        StorageDead(_8);                 // scope 1 at $DIR/generator-tiny.rs:23:21: 23:22
        _5 = const ();                   // scope 1 at $DIR/generator-tiny.rs:21:14: 24:10
        goto -> bb2;                     // scope 1 at $DIR/generator-tiny.rs:21:9: 24:10
    }

    bb5: {
        StorageLive(_3);                 // scope 0 at $DIR/generator-tiny.rs:19:16: 25:6
        StorageLive(_4);                 // scope 0 at $DIR/generator-tiny.rs:19:16: 25:6
        StorageLive(_6);                 // scope 0 at $DIR/generator-tiny.rs:19:16: 25:6
        StorageLive(_7);                 // scope 0 at $DIR/generator-tiny.rs:19:16: 25:6
        _6 = move _2;                    // scope 0 at $DIR/generator-tiny.rs:19:16: 25:6
        goto -> bb3;                     // scope 0 at $DIR/generator-tiny.rs:19:16: 25:6
    }

    bb6: {
        unreachable;                     // scope 0 at $DIR/generator-tiny.rs:19:16: 25:6
    }
}
