// MIR for `b::{closure#0}` 0 coroutine_resume /* coroutine_layout = CoroutineLayout { field_tys: { _0: CoroutineSavedTy { ty: Coroutine( DefId(0:5 ~ async_await[ccf8]::a::{closure#0}), [ (), std::future::ResumeTy, (), (), CoroutineWitness( DefId(0:5 ~ async_await[ccf8]::a::{closure#0}), [], ), (), ], ), source_info: SourceInfo { span: $DIR/async_await.rs:16:5: 16:14 (#9), scope: scope[0], }, ignore_for_traits: false, }, _1: CoroutineSavedTy { ty: Coroutine( DefId(0:5 ~ async_await[ccf8]::a::{closure#0}), [ (), std::future::ResumeTy, (), (), CoroutineWitness( DefId(0:5 ~ async_await[ccf8]::a::{closure#0}), [], ), (), ], ), source_info: SourceInfo { span: $DIR/async_await.rs:17:5: 17:14 (#11), scope: scope[0], }, ignore_for_traits: false, }, }, variant_fields: { Unresumed(0): [], Returned (1): [], Panicked (2): [], Suspend0 (3): [_0], Suspend1 (4): [_1], }, storage_conflicts: BitMatrix(2x2) { (_0, _0), (_1, _1), }, } */ fn b::{closure#0}(_1: Pin<&mut {async fn body of b()}>, _2: &mut Context<'_>) -> Poll<()> { debug _task_context => _38; let mut _0: std::task::Poll<()>; let _3: (); let mut _4: {async fn body of a()}; let mut _5: {async fn body of a()}; let mut _6: {async fn body of a()}; let mut _7: (); let _8: (); let mut _9: std::task::Poll<()>; let mut _10: std::pin::Pin<&mut {async fn body of a()}>; let mut _11: &mut {async fn body of a()}; let mut _12: &mut {async fn body of a()}; let mut _13: &mut std::task::Context<'_>; let mut _14: &mut std::task::Context<'_>; let mut _15: &mut std::task::Context<'_>; let mut _16: isize; let mut _18: !; let mut _19: &mut std::task::Context<'_>; let mut _20: (); let mut _21: {async fn body of a()}; let mut _22: {async fn body of a()}; let mut _23: {async fn body of a()}; let _24: (); let mut _25: std::task::Poll<()>; let mut _26: std::pin::Pin<&mut {async fn body of a()}>; let mut _27: &mut {async fn body of a()}; let mut _28: &mut {async fn body of a()}; let mut _29: &mut std::task::Context<'_>; let mut _30: &mut std::task::Context<'_>; let mut _31: &mut std::task::Context<'_>; let mut _32: isize; let mut _34: !; let mut _35: &mut std::task::Context<'_>; let mut _36: (); let mut _37: (); let mut _38: &mut std::task::Context<'_>; let mut _39: u32; scope 1 { debug __awaitee => (((*(_1.0: &mut {async fn body of b()})) as variant#3).0: {async fn body of a()}); let _17: (); scope 2 { debug result => _17; } } scope 3 { debug __awaitee => (((*(_1.0: &mut {async fn body of b()})) as variant#4).0: {async fn body of a()}); let _33: (); scope 4 { debug result => _33; } } bb0: { _39 = discriminant((*(_1.0: &mut {async fn body of b()}))); switchInt(move _39) -> [0: bb1, 1: bb29, 3: bb27, 4: bb28, otherwise: bb8]; } bb1: { _38 = move _2; StorageLive(_3); StorageLive(_4); StorageLive(_5); _5 = a() -> [return: bb2, unwind unreachable]; } bb2: { _4 = <{async fn body of a()} as IntoFuture>::into_future(move _5) -> [return: bb3, unwind unreachable]; } bb3: { StorageDead(_5); PlaceMention(_4); nop; (((*(_1.0: &mut {async fn body of b()})) as variant#3).0: {async fn body of a()}) = move _4; goto -> bb4; } bb4: { StorageLive(_8); StorageLive(_9); StorageLive(_10); StorageLive(_11); StorageLive(_12); _12 = &mut (((*(_1.0: &mut {async fn body of b()})) as variant#3).0: {async fn body of a()}); _11 = &mut (*_12); _10 = Pin::<&mut {async fn body of a()}>::new_unchecked(move _11) -> [return: bb5, unwind unreachable]; } bb5: { StorageDead(_11); StorageLive(_13); StorageLive(_14); StorageLive(_15); _15 = copy _38; _14 = move _15; goto -> bb6; } bb6: { _13 = &mut (*_14); StorageDead(_15); _9 = <{async fn body of a()} as Future>::poll(move _10, move _13) -> [return: bb7, unwind unreachable]; } bb7: { StorageDead(_13); StorageDead(_10); PlaceMention(_9); _16 = discriminant(_9); switchInt(move _16) -> [0: bb10, 1: bb9, otherwise: bb8]; } bb8: { unreachable; } bb9: { _8 = const (); StorageDead(_14); StorageDead(_12); StorageDead(_9); StorageDead(_8); StorageLive(_19); StorageLive(_20); _20 = (); _0 = Poll::<()>::Pending; StorageDead(_3); StorageDead(_4); StorageDead(_19); StorageDead(_20); discriminant((*(_1.0: &mut {async fn body of b()}))) = 3; return; } bb10: { StorageLive(_17); _17 = copy ((_9 as Ready).0: ()); _3 = copy _17; StorageDead(_17); StorageDead(_14); StorageDead(_12); StorageDead(_9); StorageDead(_8); drop((((*(_1.0: &mut {async fn body of b()})) as variant#3).0: {async fn body of a()})) -> [return: bb12, unwind unreachable]; } bb11: { StorageDead(_20); _38 = move _19; StorageDead(_19); _7 = const (); goto -> bb4; } bb12: { nop; goto -> bb13; } bb13: { StorageDead(_4); StorageDead(_3); StorageLive(_21); StorageLive(_22); _22 = a() -> [return: bb14, unwind unreachable]; } bb14: { _21 = <{async fn body of a()} as IntoFuture>::into_future(move _22) -> [return: bb15, unwind unreachable]; } bb15: { StorageDead(_22); PlaceMention(_21); nop; (((*(_1.0: &mut {async fn body of b()})) as variant#4).0: {async fn body of a()}) = move _21; goto -> bb16; } bb16: { StorageLive(_24); StorageLive(_25); StorageLive(_26); StorageLive(_27); StorageLive(_28); _28 = &mut (((*(_1.0: &mut {async fn body of b()})) as variant#4).0: {async fn body of a()}); _27 = &mut (*_28); _26 = Pin::<&mut {async fn body of a()}>::new_unchecked(move _27) -> [return: bb17, unwind unreachable]; } bb17: { StorageDead(_27); StorageLive(_29); StorageLive(_30); StorageLive(_31); _31 = copy _38; _30 = move _31; goto -> bb18; } bb18: { _29 = &mut (*_30); StorageDead(_31); _25 = <{async fn body of a()} as Future>::poll(move _26, move _29) -> [return: bb19, unwind unreachable]; } bb19: { StorageDead(_29); StorageDead(_26); PlaceMention(_25); _32 = discriminant(_25); switchInt(move _32) -> [0: bb21, 1: bb20, otherwise: bb8]; } bb20: { _24 = const (); StorageDead(_30); StorageDead(_28); StorageDead(_25); StorageDead(_24); StorageLive(_35); StorageLive(_36); _36 = (); _0 = Poll::<()>::Pending; StorageDead(_21); StorageDead(_35); StorageDead(_36); discriminant((*(_1.0: &mut {async fn body of b()}))) = 4; return; } bb21: { StorageLive(_33); _33 = copy ((_25 as Ready).0: ()); _37 = copy _33; StorageDead(_33); StorageDead(_30); StorageDead(_28); StorageDead(_25); StorageDead(_24); drop((((*(_1.0: &mut {async fn body of b()})) as variant#4).0: {async fn body of a()})) -> [return: bb23, unwind unreachable]; } bb22: { StorageDead(_36); _38 = move _35; StorageDead(_35); _7 = const (); goto -> bb16; } bb23: { nop; goto -> bb24; } bb24: { StorageDead(_21); goto -> bb26; } bb25: { _0 = Poll::<()>::Ready(move _37); discriminant((*(_1.0: &mut {async fn body of b()}))) = 1; return; } bb26: { goto -> bb25; } bb27: { StorageLive(_3); StorageLive(_4); StorageLive(_19); StorageLive(_20); _19 = move _2; goto -> bb11; } bb28: { StorageLive(_21); StorageLive(_35); StorageLive(_36); _35 = move _2; goto -> bb22; } bb29: { assert(const false, "`async fn` resumed after completion") -> [success: bb29, unwind unreachable]; } }