Skip to content

Instantly share code, notes, and snippets.

@lqd
Last active July 8, 2019 14:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lqd/44fb87e709d36e0b2ddc5949dde4243e to your computer and use it in GitHub Desktop.
Save lqd/44fb87e709d36e0b2ddc5949dde4243e to your computer and use it in GitHub Desktop.
// 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