]> git.lizzy.rs Git - rust.git/blob - src/test/mir-opt/match_false_edges.rs
Rollup merge of #67791 - Zoxc:lift-interning, r=eddyb
[rust.git] / src / test / mir-opt / match_false_edges.rs
1 // compile-flags: -Z borrowck=mir
2
3 fn guard() -> bool {
4     false
5 }
6
7 fn guard2(_:i32) -> bool {
8     true
9 }
10
11 // no_mangle to make sure this gets instantiated even in an executable.
12 #[no_mangle]
13 pub fn full_tested_match() {
14     let _ = match Some(42) {
15         Some(x) if guard() => (1, x),
16         Some(y) => (2, y),
17         None => (3, 3),
18     };
19 }
20
21 // no_mangle to make sure this gets instantiated even in an executable.
22 #[no_mangle]
23 pub fn full_tested_match2() {
24     let _ = match Some(42) {
25         Some(x) if guard() => (1, x),
26         None => (3, 3),
27         Some(y) => (2, y),
28     };
29 }
30
31 fn main() {
32     let _ = match Some(1) {
33         Some(_w) if guard() => 1,
34         _x => 2,
35         Some(y) if guard2(y) => 3,
36         _z => 4,
37     };
38 }
39
40 // END RUST SOURCE
41 //
42 // START rustc.full_tested_match.PromoteTemps.after.mir
43 //  bb0: {
44 //      ...
45 //      _2 = std::option::Option::<i32>::Some(const 42i32,);
46 //      FakeRead(ForMatchedPlace, _2);
47 //      _3 = discriminant(_2);
48 //      switchInt(move _3) -> [0isize: bb4, 1isize: bb2, otherwise: bb5];
49 //  }
50 //  bb1 (cleanup): {
51 //      resume;
52 //  }
53 //  bb2: {
54 //      falseEdges -> [real: bb6, imaginary: bb3]; //pre_binding1
55 //  }
56 //  bb3: {
57 //      falseEdges -> [real: bb10, imaginary: bb4]; //pre_binding2
58 //  }
59 //  bb4: { //pre_binding3 and arm3
60 //      _1 = (const 3i32, const 3i32);
61 //      goto -> bb11;
62 //  }
63 //  bb5: {
64 //      unreachable;
65 //  }
66 //  bb6: { // binding1 and guard
67 //      StorageLive(_6);
68 //      _11 = const full_tested_match::promoted[0];
69 //      _6 = &(((*_11) as Some).0: i32);
70 //      _4 = &shallow _2;
71 //      StorageLive(_7);
72 //      _7 = const guard() -> [return: bb7, unwind: bb1];
73 //  }
74 //  bb7: { // end of guard
75 //      switchInt(move _7) -> [false: bb9, otherwise: bb8];
76 //  }
77 //  bb8: { // arm1
78 //      StorageDead(_7);
79 //      FakeRead(ForMatchGuard, _4);
80 //      FakeRead(ForGuardBinding, _6);
81 //      StorageLive(_5);
82 //      _5 = ((_2 as Some).0: i32);
83 //      StorageLive(_8);
84 //      _8 = _5;
85 //      _1 = (const 1i32, move _8);
86 //      StorageDead(_8);
87 //      StorageDead(_5);
88 //      StorageDead(_6);
89 //      goto -> bb11;
90 //  }
91 //  bb9: { // to pre_binding2
92 //      StorageDead(_7);
93 //      StorageDead(_6);
94 //      goto -> bb3;
95 //  }
96 //  bb10: { // arm2
97 //      StorageLive(_9);
98 //      _9 = ((_2 as Some).0: i32);
99 //      StorageLive(_10);
100 //      _10 = _9;
101 //      _1 = (const 2i32, move _10);
102 //      StorageDead(_10);
103 //      StorageDead(_9);
104 //      goto -> bb11;
105 //  }
106 //  bb11: { // arm3
107 //      StorageDead(_2);
108 //      StorageDead(_1);
109 //      _0 = ();
110 //      return;
111 //  }
112 // END rustc.full_tested_match.PromoteTemps.after.mir
113 //
114 // START rustc.full_tested_match2.PromoteTemps.before.mir
115 //  bb0: {
116 //      ...
117 //      _2 = std::option::Option::<i32>::Some(const 42i32,);
118 //      FakeRead(ForMatchedPlace, _2);
119 //      _3 = discriminant(_2);
120 //      switchInt(move _3) -> [0isize: bb3, 1isize: bb2, otherwise: bb4];
121 //  }
122 //  bb1 (cleanup): {
123 //      resume;
124 //  }
125 //  bb2: {
126 //      falseEdges -> [real: bb5, imaginary: bb3];
127 //  }
128 //  bb3: {
129 //      falseEdges -> [real: bb9, imaginary: bb10];
130 //  }
131 //  bb4: { // to arm3 (can skip 2 since this is `Some`)
132 //      unreachable;
133 //  }
134 //  bb5: { // binding1 and guard
135 //      StorageLive(_6);
136 //      _6 = &((_2 as Some).0: i32);
137 //      _4 = &shallow _2;
138 //      StorageLive(_7);
139 //      _7 = const guard() -> [return: bb6, unwind: bb1];
140 //  }
141 //  bb6: { // end of guard
142 //      switchInt(move _7) -> [false: bb8, otherwise: bb7];
143 //  }
144 //  bb7: {
145 //      StorageDead(_7);
146 //      FakeRead(ForMatchGuard, _4);
147 //      FakeRead(ForGuardBinding, _6);
148 //      StorageLive(_5);
149 //      _5 = ((_2 as Some).0: i32);
150 //      StorageLive(_8);
151 //      _8 = _5;
152 //      _1 = (const 1i32, move _8);
153 //      StorageDead(_8);
154 //      StorageDead(_5);
155 //      StorageDead(_6);
156 //      goto -> bb11;
157 //  }
158 //  bb8: { // to pre_binding3 (can skip 2 since this is `Some`)
159 //      StorageDead(_7);
160 //      StorageDead(_6);
161 //      falseEdges -> [real: bb10, imaginary: bb3];
162 //  }
163 //  bb9: { // arm2
164 //      _1 = (const 3i32, const 3i32);
165 //      goto -> bb11;
166 //  }
167 //  bb10: { // binding3 and arm3
168 //      StorageLive(_9);
169 //      _9 = ((_2 as Some).0: i32);
170 //      StorageLive(_10);
171 //      _10 = _9;
172 //      _1 = (const 2i32, move _10);
173 //      StorageDead(_10);
174 //      StorageDead(_9);
175 //      goto -> bb11;
176 //  }
177 //  bb11: {
178 //      StorageDead(_2);
179 //      StorageDead(_1);
180 //      _0 = ();
181 //      return;
182 //  }
183 // END rustc.full_tested_match2.PromoteTemps.before.mir
184 //
185 // START rustc.main.PromoteTemps.before.mir
186 //  bb0: {
187 //     ...
188 //      _2 = std::option::Option::<i32>::Some(const 1i32,);
189 //      FakeRead(ForMatchedPlace, _2);
190 //      _4 = discriminant(_2);
191 //      switchInt(move _4) -> [1isize: bb2, otherwise: bb3];
192 //  }
193 //  bb1 (cleanup): {
194 //      resume;
195 //  }
196 //  bb2: {
197 //      falseEdges -> [real: bb5, imaginary: bb3];
198 //  }
199 //  bb3: {
200 //      falseEdges -> [real: bb9, imaginary: bb4];
201 //  }
202 //  bb4: {
203 //      falseEdges -> [real: bb10, imaginary: bb14];
204 //  }
205 //  bb5: {
206 //      StorageLive(_7);
207 //      _7 = &((_2 as Some).0: i32);
208 //      _5 = &shallow _2;
209 //      StorageLive(_8);
210 //      _8 = const guard() -> [return: bb6, unwind: bb1];
211 //  }
212 //  bb6: { //end of guard1
213 //      switchInt(move _8) -> [false: bb8, otherwise: bb7];
214 //  }
215 //  bb7: {
216 //      StorageDead(_8);
217 //      FakeRead(ForMatchGuard, _5);
218 //      FakeRead(ForGuardBinding, _7);
219 //      StorageLive(_6);
220 //      _6 = ((_2 as Some).0: i32);
221 //      _1 = const 1i32;
222 //      StorageDead(_6);
223 //      StorageDead(_7);
224 //      goto -> bb15;
225 //  }
226 //  bb8: {
227 //      StorageDead(_8);
228 //      StorageDead(_7);
229 //      falseEdges -> [real: bb3, imaginary: bb3];
230 //  }
231 //  bb9: { // binding2 & arm2
232 //      StorageLive(_9);
233 //      _9 = _2;
234 //      _1 = const 2i32;
235 //      StorageDead(_9);
236 //      goto -> bb15;
237 //  }
238 //  bb10: { // binding3: Some(y) if guard2(y)
239 //      StorageLive(_11);
240 //      _11 = &((_2 as Some).0: i32);
241 //      _5 = &shallow _2;
242 //      StorageLive(_12);
243 //      StorageLive(_13);
244 //      _13 = (*_11);
245 //      _12 = const guard2(move _13) -> [return: bb11, unwind: bb1];
246 //  }
247 //  bb11: { // end of guard2
248 //      StorageDead(_13);
249 //      switchInt(move _12) -> [false: bb13, otherwise: bb12];
250 //  }
251 //  bb12: { // binding4 & arm4
252 //      StorageDead(_12);
253 //      FakeRead(ForMatchGuard, _5);
254 //      FakeRead(ForGuardBinding, _11);
255 //      StorageLive(_10);
256 //      _10 = ((_2 as Some).0: i32);
257 //      _1 = const 3i32;
258 //      StorageDead(_10);
259 //      StorageDead(_11);
260 //      goto -> bb15;
261 //  }
262 //  bb13: {
263 //      StorageDead(_12);
264 //      StorageDead(_11);
265 //      falseEdges -> [real: bb14, imaginary: bb14];
266 //  }
267 //  bb14: {
268 //      StorageLive(_14);
269 //      _14 = _2;
270 //      _1 = const 4i32;
271 //      StorageDead(_14);
272 //      goto -> bb15;
273 //  }
274 //  bb15: {
275 //      StorageDead(_2);
276 //      StorageDead(_1);
277 //      _0 = ();
278 //      return;
279 //  }
280 // END rustc.main.PromoteTemps.before.mir