// MIR for `main` after built

| User Type Annotations
| 0: user_ty: Canonical { value: TypeOf(DefId(0:3 ~ issue_99325[d56d]::function_with_bytes), UserArgs { args: [&*b"AAAA"], user_self_ty: None }), max_universe: U0, variables: [], defining_opaque_types: [] }, span: $DIR/issue_99325.rs:13:16: 13:46, inferred_ty: fn() -> &'static [u8] {function_with_bytes::<&*b"AAAA">}
| 1: user_ty: Canonical { value: TypeOf(DefId(0:3 ~ issue_99325[d56d]::function_with_bytes), UserArgs { args: [UnevaluatedConst { def: DefId(0:8 ~ issue_99325[d56d]::main::{constant#1}), args: [] }], user_self_ty: None }), max_universe: U0, variables: [], defining_opaque_types: [] }, span: $DIR/issue_99325.rs:14:16: 14:68, inferred_ty: fn() -> &'static [u8] {function_with_bytes::<&*b"AAAA">}
|
fn main() -> () {
    let mut _0: ();
    let _1: ();
    let mut _2: (&&[u8], &&[u8; 4]);
    let mut _3: &&[u8];
    let _4: &[u8];
    let mut _5: &&[u8; 4];
    let _6: &[u8; 4];
    let _7: [u8; 4];
    let _8: &&[u8];
    let _9: &&[u8; 4];
    let mut _10: bool;
    let mut _11: &&[u8];
    let mut _12: &&[u8; 4];
    let mut _13: !;
    let _15: !;
    let mut _16: core::panicking::AssertKind;
    let mut _17: &&[u8];
    let _18: &&[u8];
    let mut _19: &&[u8; 4];
    let _20: &&[u8; 4];
    let mut _21: std::option::Option<std::fmt::Arguments<'_>>;
    let _22: ();
    let mut _23: (&&[u8], &&[u8; 4]);
    let mut _24: &&[u8];
    let _25: &[u8];
    let mut _26: &&[u8; 4];
    let _27: &[u8; 4];
    let _28: &&[u8];
    let _29: &&[u8; 4];
    let mut _30: bool;
    let mut _31: &&[u8];
    let mut _32: &&[u8; 4];
    let mut _33: !;
    let _35: !;
    let mut _36: core::panicking::AssertKind;
    let mut _37: &&[u8];
    let _38: &&[u8];
    let mut _39: &&[u8; 4];
    let _40: &&[u8; 4];
    let mut _41: std::option::Option<std::fmt::Arguments<'_>>;
    scope 1 {
        debug left_val => _8;
        debug right_val => _9;
        let _14: core::panicking::AssertKind;
        scope 2 {
            debug kind => _14;
        }
    }
    scope 3 {
        debug left_val => _28;
        debug right_val => _29;
        let _34: core::panicking::AssertKind;
        scope 4 {
            debug kind => _34;
        }
    }

    bb0: {
        StorageLive(_1);
        StorageLive(_2);
        StorageLive(_3);
        StorageLive(_4);
        _4 = function_with_bytes::<&*b"AAAA">() -> [return: bb1, unwind: bb23];
    }

    bb1: {
        _3 = &_4;
        StorageLive(_5);
        StorageLive(_6);
        StorageLive(_7);
        _7 = [const 65_u8, const 65_u8, const 65_u8, const 65_u8];
        _6 = &_7;
        _5 = &_6;
        _2 = (move _3, move _5);
        StorageDead(_5);
        StorageDead(_3);
        PlaceMention(_2);
        StorageLive(_8);
        _8 = copy (_2.0: &&[u8]);
        StorageLive(_9);
        _9 = copy (_2.1: &&[u8; 4]);
        StorageLive(_10);
        StorageLive(_11);
        _11 = &(*_8);
        StorageLive(_12);
        _12 = &(*_9);
        _10 = <&[u8] as PartialEq<&[u8; 4]>>::eq(move _11, move _12) -> [return: bb3, unwind: bb23];
    }

    bb2: {
        FakeRead(ForMatchedPlace(None), _2);
        unreachable;
    }

    bb3: {
        switchInt(move _10) -> [0: bb5, otherwise: bb4];
    }

    bb4: {
        StorageDead(_12);
        StorageDead(_11);
        goto -> bb9;
    }

    bb5: {
        goto -> bb6;
    }

    bb6: {
        StorageDead(_12);
        StorageDead(_11);
        StorageLive(_14);
        _14 = core::panicking::AssertKind::Eq;
        FakeRead(ForLet(None), _14);
        StorageLive(_15);
        StorageLive(_16);
        _16 = move _14;
        StorageLive(_17);
        StorageLive(_18);
        _18 = &(*_8);
        _17 = &(*_18);
        StorageLive(_19);
        StorageLive(_20);
        _20 = &(*_9);
        _19 = &(*_20);
        StorageLive(_21);
        _21 = Option::<Arguments<'_>>::None;
        _15 = core::panicking::assert_failed::<&[u8], &[u8; 4]>(move _16, move _17, move _19, move _21) -> bb23;
    }

    bb7: {
        StorageDead(_21);
        StorageDead(_19);
        StorageDead(_17);
        StorageDead(_16);
        StorageDead(_20);
        StorageDead(_18);
        StorageDead(_15);
        StorageDead(_14);
        unreachable;
    }

    bb8: {
        goto -> bb10;
    }

    bb9: {
        _1 = const ();
        goto -> bb10;
    }

    bb10: {
        StorageDead(_10);
        StorageDead(_9);
        StorageDead(_8);
        goto -> bb11;
    }

    bb11: {
        StorageDead(_7);
        StorageDead(_6);
        StorageDead(_4);
        StorageDead(_2);
        StorageDead(_1);
        StorageLive(_22);
        StorageLive(_23);
        StorageLive(_24);
        StorageLive(_25);
        _25 = function_with_bytes::<&*b"AAAA">() -> [return: bb12, unwind: bb23];
    }

    bb12: {
        _24 = &_25;
        StorageLive(_26);
        StorageLive(_27);
        _27 = const b"AAAA";
        _26 = &_27;
        _23 = (move _24, move _26);
        StorageDead(_26);
        StorageDead(_24);
        PlaceMention(_23);
        StorageLive(_28);
        _28 = copy (_23.0: &&[u8]);
        StorageLive(_29);
        _29 = copy (_23.1: &&[u8; 4]);
        StorageLive(_30);
        StorageLive(_31);
        _31 = &(*_28);
        StorageLive(_32);
        _32 = &(*_29);
        _30 = <&[u8] as PartialEq<&[u8; 4]>>::eq(move _31, move _32) -> [return: bb14, unwind: bb23];
    }

    bb13: {
        FakeRead(ForMatchedPlace(None), _23);
        unreachable;
    }

    bb14: {
        switchInt(move _30) -> [0: bb16, otherwise: bb15];
    }

    bb15: {
        StorageDead(_32);
        StorageDead(_31);
        goto -> bb20;
    }

    bb16: {
        goto -> bb17;
    }

    bb17: {
        StorageDead(_32);
        StorageDead(_31);
        StorageLive(_34);
        _34 = core::panicking::AssertKind::Eq;
        FakeRead(ForLet(None), _34);
        StorageLive(_35);
        StorageLive(_36);
        _36 = move _34;
        StorageLive(_37);
        StorageLive(_38);
        _38 = &(*_28);
        _37 = &(*_38);
        StorageLive(_39);
        StorageLive(_40);
        _40 = &(*_29);
        _39 = &(*_40);
        StorageLive(_41);
        _41 = Option::<Arguments<'_>>::None;
        _35 = core::panicking::assert_failed::<&[u8], &[u8; 4]>(move _36, move _37, move _39, move _41) -> bb23;
    }

    bb18: {
        StorageDead(_41);
        StorageDead(_39);
        StorageDead(_37);
        StorageDead(_36);
        StorageDead(_40);
        StorageDead(_38);
        StorageDead(_35);
        StorageDead(_34);
        unreachable;
    }

    bb19: {
        goto -> bb21;
    }

    bb20: {
        _22 = const ();
        goto -> bb21;
    }

    bb21: {
        StorageDead(_30);
        StorageDead(_29);
        StorageDead(_28);
        goto -> bb22;
    }

    bb22: {
        StorageDead(_27);
        StorageDead(_25);
        StorageDead(_23);
        StorageDead(_22);
        _0 = const ();
        return;
    }

    bb23 (cleanup): {
        resume;
    }
}

ALLOC0 (size: 4, align: 1) {
    41 41 41 41                                     │ AAAA
}
