-
-
Save lqd/44fb87e709d36e0b2ddc5949dde4243e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// MIR for `loopdydoo` | |
// source = MirSource { instance: Item(DefId(0:20 ~ polonius_imprecision[317d]::loopdydoo[0])), promoted: None } | |
// pass_name = nll | |
// disambiguator = 0 | |
| Free Region Mapping | |
| '_#0r | Global | ['_#0r, '_#1r] | |
| '_#1r | Local | ['_#1r] | |
| | |
| Inferred Region Values | |
| '_#0r | U0 | r3 | {bb0[0..=5], bb1[0], bb2[0], bb3[0..=3], bb4[0..=5], '_#0r, '_#1r} | |
| '_#1r | U0 | r4 | {bb0[0..=5], bb1[0], bb2[0], bb3[0..=3], bb4[0..=5], '_#1r} | |
| '_#2r | U0 | r0 | {bb0[3..=5], bb2[0], bb3[0..=3], bb4[0..=5]} | |
| '_#3r | U0 | r1 | {bb0[4..=5], bb2[0], bb3[0..=3], bb4[0..=5]} | |
| '_#4r | U0 | r2 | {bb0[4..=5], bb2[0], bb3[0..=3], bb4[0..=5]} | |
| '_#5r | U0 | r5 | {bb0[4..=5], bb2[0], bb3[0..=3], bb4[0..=5]} | |
| '_#6r | U0 | r8 | {bb0[4..=5], bb2[0], bb3[0..=3], bb4[0..=5]} | |
| '_#7r | U0 | r6 | {bb0[4..=5], bb2[0], bb3[0..=3], bb4[0..=5]} | |
| '_#8r | U0 | r7 | {bb0[4..=5], bb2[0], bb3[0..=3], bb4[0..=5]} | |
| | |
| Inference Constraints | |
| '_#0r live at {bb0[0..=5], bb1[0], bb2[0], bb3[0..=3], bb4[0..=5]} | |
| '_#1r live at {bb0[0..=5], bb1[0], bb2[0], bb3[0..=3], bb4[0..=5]} | |
| '_#2r live at {bb0[3]} | |
| '_#3r live at {bb3[2]} | |
| '_#4r live at {bb4[2]} | |
| '_#5r live at {bb0[4..=5], bb2[0], bb3[0..=2], bb4[3..=5]} | |
| '_#6r live at {bb4[0..=2]} | |
| '_#7r live at {bb3[3]} | |
| '_#8r live at {bb3[3]} | |
| '_#2r: '_#5r (r0: r5), due to Assignment at Single(bb0[3]) | |
| '_#3r: '_#7r (r1: r6), due to Boring at Single(bb3[2]) | |
| '_#4r: '_#5r (r2: r5), due to Assignment at Single(bb4[2]) | |
| '_#5r: '_#3r (r5: r1), due to Boring at Single(bb3[2]) | |
| '_#6r: '_#4r (r8: r2), due to Boring at Single(bb4[2]) | |
| '_#7r: '_#8r (r6: r7), due to CallArgument at Single(bb3[3]) | |
| '_#8r: '_#6r (r7: r8), due to Assignment at Single(bb3[3]) | |
| | |
fn loopdydoo() -> () { | |
let mut _0: (); // return place | |
let mut _1: &'_#5r mut Thing; // "temp" | |
let mut _2: Thing; | |
let mut _3: !; | |
let mut _4: (); | |
let mut _6: &'_#7r mut Thing; | |
scope 1 { | |
let _5: &'_#6r mut Thing; // "v" | |
scope 2 { | |
} | |
} | |
bb0: { | |
StorageLive(_1); // bb0[0]: p03-04 | |
StorageLive(_2); // bb0[1]: p05-06 | |
_2 = Thing; // bb0[2]: start p07: invalidates L0 | |
// bb0[2]: mid p08: kill L0 | |
_1 = &'_#2r mut _2; // bb0[3]: start p09: invalidates L0 | |
// bb0[3]: mid p00: kill L1, borrow_region '2 L0 | |
FakeRead(ForLet, _1); // bb0[4]: p10-11 | |
goto -> bb2; // bb0[5]: p12-13 | |
} | |
bb1 (cleanup): { | |
resume; // bb1[0]: p15-16 - p15: invalidates L0 | |
} | |
bb2: { | |
falseUnwind | |
-> [real: bb3, cleanup: bb1]; // bb2[0]: p14-17 | |
} | |
bb3: { | |
StorageLive(_5); // bb3[0]: p18-19 | |
StorageLive(_6); // bb3[1]: p20-21 | |
_6 = &'_#3r mut (*_1); // bb3[2]: start p22: invalidates L1 | |
// bb3[2]: mid p01: '5 requires L2 since p02, '5 flows into '7, '7 requires L2 (but '7 is not live) // borrow_region '3 L1 | |
_5 = const Thing::next(move _6) // bb3[3]: start p23: invalidates L2, L2 borrow_live_at ('7 requires L2 since p01, but '7 is live here, therefore L2 is live) // ERROR 1 | |
-> [return: bb4, unwind: bb1]; // bb3[3]: mid p24: '7r requires L2 since p01, '7 flows into '6, '6 requires L2 -- no killed facts here, but the call should kill L2 (this only fixes error #2 later) | |
} | |
bb4: { | |
StorageDead(_6); // bb4[0]: p25-26 | |
FakeRead(ForLet, _5); // bb4[1]: p27-28 | |
_1 = &'_#4r mut (*_5); // bb4[2]: start p29: invalidates L2, L2 borrow_live_at, '6 requires L2 since p24 // ERROR 2 -- which disappears if we indeed kill L2 at mid bb3[3] (p24) | |
// bb4[2]: mid p02: borrow_region '4 L2, '4 requires L2, '4 flows into '5, '5 requires L2, kill L1 | |
_4 = (); // bb4[3]: p30-31 | |
StorageDead(_5); // bb4[4]: p32-33 | |
goto -> bb2; // bb4[5]: p34-35 | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment