]> git.proxmox.com Git - rustc.git/blob - src/test/mir-opt/match_false_edges.rs
New upstream version 1.43.0+dfsg1
[rustc.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: bb2, 1isize: bb3, otherwise: bb5];
49 // }
50 // bb1 (cleanup): {
51 // resume;
52 // }
53 // bb2: { // pre_binding3 and arm3
54 // _1 = (const 3i32, const 3i32);
55 // goto -> bb11;
56 // }
57 // bb3: {
58 // falseEdges -> [real: bb6, imaginary: bb4]; //pre_binding1
59 // }
60 // bb4: {
61 // falseEdges -> [real: bb10, imaginary: bb2]; //pre_binding2
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 -> bb4;
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: {
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: bb2, 1isize: bb3, otherwise: bb5];
121 // }
122 // bb1 (cleanup): {
123 // resume;
124 // }
125 // bb2: { // pre_binding2
126 // falseEdges -> [real: bb10, imaginary: bb4];
127 // }
128 // bb3: { // pre_binding1
129 // falseEdges -> [real: bb6, imaginary: bb2];
130 // }
131 // bb4: { // binding3 and arm3
132 // StorageLive(_9);
133 // _9 = ((_2 as Some).0: i32);
134 // StorageLive(_10);
135 // _10 = _9;
136 // _1 = (const 2i32, move _10);
137 // StorageDead(_10);
138 // StorageDead(_9);
139 // goto -> bb11;
140 // }
141 // bb5: {
142 // unreachable;
143 // }
144 // bb6: {
145 // StorageLive(_6);
146 // _6 = &((_2 as Some).0: i32);
147 // _4 = &shallow _2;
148 // StorageLive(_7);
149 // _7 = const guard() -> [return: bb7, unwind: bb1];
150 // }
151 // bb7: { // end of guard
152 // switchInt(move _7) -> [false: bb9, otherwise: bb8];
153 // }
154 // bb8: {
155 // StorageDead(_7);
156 // FakeRead(ForMatchGuard, _4);
157 // FakeRead(ForGuardBinding, _6);
158 // StorageLive(_5);
159 // _5 = ((_2 as Some).0: i32);
160 // StorageLive(_8);
161 // _8 = _5;
162 // _1 = (const 1i32, move _8);
163 // StorageDead(_8);
164 // StorageDead(_5);
165 // StorageDead(_6);
166 // goto -> bb11;
167 // }
168 // bb9: { // to pre_binding3 (can skip 2 since this is `Some`)
169 // StorageDead(_7);
170 // StorageDead(_6);
171 // falseEdges -> [real: bb4, imaginary: bb2];
172 // }
173 // bb10: { // arm2
174 // _1 = (const 3i32, const 3i32);
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: bb3, otherwise: bb2];
192 // }
193 // bb1 (cleanup): {
194 // resume;
195 // }
196 // bb2: {
197 // falseEdges -> [real: bb10, imaginary: bb5];
198 // }
199 // bb3: {
200 // falseEdges -> [real: bb6, imaginary: bb2];
201 // }
202 // bb4: {
203 // StorageLive(_14);
204 // _14 = _2;
205 // _1 = const 4i32;
206 // StorageDead(_14);
207 // goto -> bb15;
208 // }
209 // bb5: {
210 // falseEdges -> [real: bb11, imaginary: bb4];
211 // }
212 // bb6: { //end of guard1
213 // StorageLive(_7);
214 // _7 = &((_2 as Some).0: i32);
215 // _5 = &shallow _2;
216 // StorageLive(_8);
217 // _8 = const guard() -> [return: bb7, unwind: bb1];
218 // }
219 // bb7: {
220 // switchInt(move _8) -> [false: bb9, otherwise: bb8];
221 // }
222 // bb8: {
223 // StorageDead(_8);
224 // FakeRead(ForMatchGuard, _5);
225 // FakeRead(ForGuardBinding, _7);
226 // StorageLive(_6);
227 // _6 = ((_2 as Some).0: i32);
228 // _1 = const 1i32;
229 // StorageDead(_6);
230 // StorageDead(_7);
231 // goto -> bb15;
232 // }
233 // bb9: {
234 // StorageDead(_8);
235 // StorageDead(_7);
236 // falseEdges -> [real: bb2, imaginary: bb2];
237 // }
238 // bb10: { // binding2 & arm2
239 // StorageLive(_9);
240 // _9 = _2;
241 // _1 = const 2i32;
242 // StorageDead(_9);
243 // goto -> bb15;
244 // }
245 // bb11: { // binding3: Some(y) if guard2(y)
246 // StorageLive(_11);
247 // _11 = &((_2 as Some).0: i32);
248 // _5 = &shallow _2;
249 // StorageLive(_12);
250 // StorageLive(_13);
251 // _13 = (*_11);
252 // _12 = const guard2(move _13) -> [return: bb12, unwind: bb1];
253 // }
254 // bb12: { // end of guard2
255 // StorageDead(_13);
256 // switchInt(move _12) -> [false: bb14, otherwise: bb13];
257 // }
258 // bb13: { // binding4 & arm4
259 // StorageDead(_12);
260 // FakeRead(ForMatchGuard, _5);
261 // FakeRead(ForGuardBinding, _11);
262 // StorageLive(_10);
263 // _10 = ((_2 as Some).0: i32);
264 // _1 = const 3i32;
265 // StorageDead(_10);
266 // StorageDead(_11);
267 // goto -> bb15;
268 // }
269 // bb14: {
270 // StorageDead(_12);
271 // StorageDead(_11);
272 // falseEdges -> [real: bb4, imaginary: bb4];
273 // }
274 // bb15: {
275 // StorageDead(_2);
276 // StorageDead(_1);
277 // _0 = ();
278 // return;
279 // }
280 // END rustc.main.PromoteTemps.before.mir