1+ // Make sure redundant testing paths in `match` expressions are sorted out.
2+
3+ #![ feature( exclusive_range_pattern) ]
4+
5+ fn main ( ) {
6+ let x = 3 ;
7+ let b = true ;
8+
9+ // When `(0..=10).contains(x) && !b`, we should jump to the last arm
10+ // without testing two other candidates.
11+ match x {
12+ 0 ..10 if b => 0 ,
13+ 10 ..=20 => 1 ,
14+ -1 => 2 ,
15+ _ => 3 ,
16+ } ;
17+ }
18+
19+ // END RUST SOURCE
20+ // START rustc.main.SimplifyCfg-initial.after.mir
21+ // bb0: {
22+ // ...
23+ // _4 = Le(const 0i32, _1);
24+ // switchInt(move _4) -> [false: bb10, otherwise: bb11];
25+ // }
26+ // bb1: {
27+ // _3 = const 0i32;
28+ // goto -> bb16;
29+ // }
30+ // bb2: {
31+ // _3 = const 1i32;
32+ // goto -> bb16;
33+ // }
34+ // bb3: {
35+ // _3 = const 2i32;
36+ // goto -> bb16;
37+ // }
38+ // bb4: {
39+ // _3 = const 3i32;
40+ // goto -> bb16;
41+ // }
42+ // bb5: {
43+ // falseEdges -> [real: bb12, imaginary: bb6];
44+ // }
45+ // bb6: {
46+ // falseEdges -> [real: bb2, imaginary: bb7];
47+ // }
48+ // bb7: {
49+ // falseEdges -> [real: bb3, imaginary: bb8];
50+ // }
51+ // bb8: {
52+ // falseEdges -> [real: bb4, imaginary: bb9];
53+ // }
54+ // bb9: {
55+ // unreachable;
56+ // }
57+ // bb10: {
58+ // _7 = Le(const 10i32, _1);
59+ // switchInt(move _7) -> [false: bb14, otherwise: bb15];
60+ // }
61+ // bb11: {
62+ // _5 = Lt(_1, const 10i32);
63+ // switchInt(move _5) -> [false: bb10, otherwise: bb5];
64+ // }
65+ // bb12: {
66+ // StorageLive(_6);
67+ // _6 = _2;
68+ // switchInt(move _6) -> [false: bb13, otherwise: bb1];
69+ // }
70+ // bb13: {
71+ // falseEdges -> [real: bb8, imaginary: bb6];
72+ // }
73+ // bb14: {
74+ // switchInt(_1) -> [-1i32: bb7, otherwise: bb8];
75+ // }
76+ // bb15: {
77+ // _8 = Le(_1, const 20i32);
78+ // switchInt(move _8) -> [false: bb14, otherwise: bb6];
79+ // }
80+ // bb16: {
81+ // StorageDead(_6);
82+ // ...
83+ // return;
84+ // }
85+ // END rustc.main.SimplifyCfg-initial.after.mir
0 commit comments