// MIR for `main` after SimplifyCfg-initial

| User Type Annotations
| 0: user_ty: Canonical { value: Ty(std::option::Option<std::boxed::Box<u32>>), max_universe: U0, variables: [] }, span: $DIR/basic_assignment.rs:38:17: 38:33, inferred_ty: std::option::Option<std::boxed::Box<u32>>
| 1: user_ty: Canonical { value: Ty(std::option::Option<std::boxed::Box<u32>>), max_universe: U0, variables: [] }, span: $DIR/basic_assignment.rs:38:17: 38:33, inferred_ty: std::option::Option<std::boxed::Box<u32>>
|
fn main() -> () {
    let mut _0: ();
    let _1: bool;
    let mut _3: bool;
    let mut _6: std::option::Option<std::boxed::Box<u32>>;
    scope 1 {
        debug nodrop_x => _1;
        let _2: bool;
        scope 2 {
            debug nodrop_y => _2;
            let _4: std::option::Option<std::boxed::Box<u32>> as UserTypeProjection { base: UserType(0), projs: [] };
            scope 3 {
                debug drop_x => _4;
                let _5: std::option::Option<std::boxed::Box<u32>>;
                scope 4 {
                    debug drop_y => _5;
                }
            }
        }
    }

    bb0: {
        StorageLive(_1);
        _1 = const false;
        FakeRead(ForLet(None), _1);
        StorageLive(_2);
        StorageLive(_3);
        _3 = copy _1;
        _2 = move _3;
        StorageDead(_3);
        StorageLive(_4);
        _4 = Option::<Box<u32>>::None;
        FakeRead(ForLet(None), _4);
        AscribeUserType(_4, o, UserTypeProjection { base: UserType(1), projs: [] });
        StorageLive(_5);
        StorageLive(_6);
        _6 = move _4;
        drop(_5) -> [return: bb1, unwind: bb2];
    }

    bb1: {
        _5 = move _6;
        drop(_6) -> [return: bb3, unwind: bb6];
    }

    bb2 (cleanup): {
        _5 = move _6;
        drop(_6) -> [return: bb6, unwind terminate(cleanup)];
    }

    bb3: {
        StorageDead(_6);
        _0 = const ();
        drop(_5) -> [return: bb4, unwind: bb7];
    }

    bb4: {
        StorageDead(_5);
        drop(_4) -> [return: bb5, unwind: bb8];
    }

    bb5: {
        StorageDead(_4);
        StorageDead(_2);
        StorageDead(_1);
        return;
    }

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

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

    bb8 (cleanup): {
        resume;
    }
}
