| // Make sure redundant testing paths in `match` expressions are sorted out. |
| |
| #![feature(exclusive_range_pattern)] |
| |
| fn main() { |
| let x = 3; |
| let b = true; |
| |
| // When `(0..=10).contains(x) && !b`, we should jump to the last arm |
| // without testing two other candidates. |
| match x { |
| 0..10 if b => 0, |
| 10..=20 => 1, |
| -1 => 2, |
| _ => 3, |
| }; |
| } |
| |
| // END RUST SOURCE |
| // START rustc.main.SimplifyCfg-initial.after.mir |
| // bb0: { |
| // ... |
| // switchInt(move _6) -> [false: bb6, otherwise: bb5]; |
| // } |
| // bb1: { |
| // falseEdges -> [real: bb9, imaginary: bb2]; |
| // } |
| // bb2: { |
| // falseEdges -> [real: bb12, imaginary: bb3]; |
| // } |
| // bb3: { |
| // falseEdges -> [real: bb13, imaginary: bb4]; |
| // } |
| // bb4: { |
| // _3 = const 3i32; |
| // goto -> bb14; |
| // } |
| // bb5: { |
| // _7 = Lt(_1, const 10i32); |
| // switchInt(move _7) -> [false: bb6, otherwise: bb1]; |
| // } |
| // bb6: { |
| // _4 = Le(const 10i32, _1); |
| // switchInt(move _4) -> [false: bb8, otherwise: bb7]; |
| // } |
| // bb7: { |
| // _5 = Le(_1, const 20i32); |
| // switchInt(move _5) -> [false: bb8, otherwise: bb2]; |
| // } |
| // bb8: { |
| // switchInt(_1) -> [-1i32: bb3, otherwise: bb4]; |
| // } |
| // bb9: { |
| // _8 = &shallow _1; |
| // StorageLive(_9); |
| // _9 = _2; |
| // switchInt(move _9) -> [false: bb11, otherwise: bb10]; |
| // } |
| // bb10: { |
| // StorageDead(_9); |
| // FakeRead(ForMatchGuard, _8); |
| // _3 = const 0i32; |
| // goto -> bb14; |
| // } |
| // bb11: { |
| // StorageDead(_9); |
| // falseEdges -> [real: bb4, imaginary: bb2]; |
| // } |
| // bb12: { |
| // _3 = const 1i32; |
| // goto -> bb14; |
| // } |
| // bb13: { |
| // _3 = const 2i32; |
| // goto -> bb14; |
| // } |
| // bb14: { |
| // StorageDead(_3); |
| // _0 = (); |
| // StorageDead(_2); |
| // StorageDead(_1); |
| // return; |
| // } |
| // END rustc.main.SimplifyCfg-initial.after.mir |