]> git.proxmox.com Git - rustc.git/blob - src/test/mir-opt/match_false_edges.rs
New upstream version 1.41.1+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: 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 // _6 = &(((promoted[0]: std::option::Option<i32>) as Some).0: i32);
69 // _4 = &shallow _2;
70 // StorageLive(_7);
71 // _7 = const guard() -> [return: bb7, unwind: bb1];
72 // }
73 // bb7: { // end of guard
74 // switchInt(move _7) -> [false: bb9, otherwise: bb8];
75 // }
76 // bb8: { // arm1
77 // StorageDead(_7);
78 // FakeRead(ForMatchGuard, _4);
79 // FakeRead(ForGuardBinding, _6);
80 // StorageLive(_5);
81 // _5 = ((_2 as Some).0: i32);
82 // StorageLive(_8);
83 // _8 = _5;
84 // _1 = (const 1i32, move _8);
85 // StorageDead(_8);
86 // StorageDead(_5);
87 // StorageDead(_6);
88 // goto -> bb11;
89 // }
90 // bb9: { // to pre_binding2
91 // StorageDead(_7);
92 // StorageDead(_6);
93 // goto -> bb3;
94 // }
95 // bb10: { // arm2
96 // StorageLive(_9);
97 // _9 = ((_2 as Some).0: i32);
98 // StorageLive(_10);
99 // _10 = _9;
100 // _1 = (const 2i32, move _10);
101 // StorageDead(_10);
102 // StorageDead(_9);
103 // goto -> bb11;
104 // }
105 // bb11: { // arm3
106 // StorageDead(_2);
107 // StorageDead(_1);
108 // _0 = ();
109 // return;
110 // }
111 // END rustc.full_tested_match.PromoteTemps.after.mir
112 //
113 // START rustc.full_tested_match2.PromoteTemps.before.mir
114 // bb0: {
115 // ...
116 // _2 = std::option::Option::<i32>::Some(const 42i32,);
117 // FakeRead(ForMatchedPlace, _2);
118 // _3 = discriminant(_2);
119 // switchInt(move _3) -> [0isize: bb3, 1isize: bb2, otherwise: bb4];
120 // }
121 // bb1 (cleanup): {
122 // resume;
123 // }
124 // bb2: {
125 // falseEdges -> [real: bb5, imaginary: bb3];
126 // }
127 // bb3: {
128 // falseEdges -> [real: bb9, imaginary: bb10];
129 // }
130 // bb4: { // to arm3 (can skip 2 since this is `Some`)
131 // unreachable;
132 // }
133 // bb5: { // binding1 and guard
134 // StorageLive(_6);
135 // _6 = &((_2 as Some).0: i32);
136 // _4 = &shallow _2;
137 // StorageLive(_7);
138 // _7 = const guard() -> [return: bb6, unwind: bb1];
139 // }
140 // bb6: { // end of guard
141 // switchInt(move _7) -> [false: bb8, otherwise: bb7];
142 // }
143 // bb7: {
144 // StorageDead(_7);
145 // FakeRead(ForMatchGuard, _4);
146 // FakeRead(ForGuardBinding, _6);
147 // StorageLive(_5);
148 // _5 = ((_2 as Some).0: i32);
149 // StorageLive(_8);
150 // _8 = _5;
151 // _1 = (const 1i32, move _8);
152 // StorageDead(_8);
153 // StorageDead(_5);
154 // StorageDead(_6);
155 // goto -> bb11;
156 // }
157 // bb8: { // to pre_binding3 (can skip 2 since this is `Some`)
158 // StorageDead(_7);
159 // StorageDead(_6);
160 // falseEdges -> [real: bb10, imaginary: bb3];
161 // }
162 // bb9: { // arm2
163 // _1 = (const 3i32, const 3i32);
164 // goto -> bb11;
165 // }
166 // bb10: { // binding3 and arm3
167 // StorageLive(_9);
168 // _9 = ((_2 as Some).0: i32);
169 // StorageLive(_10);
170 // _10 = _9;
171 // _1 = (const 2i32, move _10);
172 // StorageDead(_10);
173 // StorageDead(_9);
174 // goto -> bb11;
175 // }
176 // bb11: {
177 // StorageDead(_2);
178 // StorageDead(_1);
179 // _0 = ();
180 // return;
181 // }
182 // END rustc.full_tested_match2.PromoteTemps.before.mir
183 //
184 // START rustc.main.PromoteTemps.before.mir
185 // bb0: {
186 // ...
187 // _2 = std::option::Option::<i32>::Some(const 1i32,);
188 // FakeRead(ForMatchedPlace, _2);
189 // _4 = discriminant(_2);
190 // switchInt(move _4) -> [1isize: bb2, otherwise: bb3];
191 // }
192 // bb1 (cleanup): {
193 // resume;
194 // }
195 // bb2: {
196 // falseEdges -> [real: bb5, imaginary: bb3];
197 // }
198 // bb3: {
199 // falseEdges -> [real: bb9, imaginary: bb4];
200 // }
201 // bb4: {
202 // falseEdges -> [real: bb10, imaginary: bb14];
203 // }
204 // bb5: {
205 // StorageLive(_7);
206 // _7 = &((_2 as Some).0: i32);
207 // _5 = &shallow _2;
208 // StorageLive(_8);
209 // _8 = const guard() -> [return: bb6, unwind: bb1];
210 // }
211 // bb6: { //end of guard1
212 // switchInt(move _8) -> [false: bb8, otherwise: bb7];
213 // }
214 // bb7: {
215 // StorageDead(_8);
216 // FakeRead(ForMatchGuard, _5);
217 // FakeRead(ForGuardBinding, _7);
218 // StorageLive(_6);
219 // _6 = ((_2 as Some).0: i32);
220 // _1 = const 1i32;
221 // StorageDead(_6);
222 // StorageDead(_7);
223 // goto -> bb15;
224 // }
225 // bb8: {
226 // StorageDead(_8);
227 // StorageDead(_7);
228 // falseEdges -> [real: bb3, imaginary: bb3];
229 // }
230 // bb9: { // binding2 & arm2
231 // StorageLive(_9);
232 // _9 = _2;
233 // _1 = const 2i32;
234 // StorageDead(_9);
235 // goto -> bb15;
236 // }
237 // bb10: { // binding3: Some(y) if guard2(y)
238 // StorageLive(_11);
239 // _11 = &((_2 as Some).0: i32);
240 // _5 = &shallow _2;
241 // StorageLive(_12);
242 // StorageLive(_13);
243 // _13 = (*_11);
244 // _12 = const guard2(move _13) -> [return: bb11, unwind: bb1];
245 // }
246 // bb11: { // end of guard2
247 // StorageDead(_13);
248 // switchInt(move _12) -> [false: bb13, otherwise: bb12];
249 // }
250 // bb12: { // binding4 & arm4
251 // StorageDead(_12);
252 // FakeRead(ForMatchGuard, _5);
253 // FakeRead(ForGuardBinding, _11);
254 // StorageLive(_10);
255 // _10 = ((_2 as Some).0: i32);
256 // _1 = const 3i32;
257 // StorageDead(_10);
258 // StorageDead(_11);
259 // goto -> bb15;
260 // }
261 // bb13: {
262 // StorageDead(_12);
263 // StorageDead(_11);
264 // falseEdges -> [real: bb14, imaginary: bb14];
265 // }
266 // bb14: {
267 // StorageLive(_14);
268 // _14 = _2;
269 // _1 = const 4i32;
270 // StorageDead(_14);
271 // goto -> bb15;
272 // }
273 // bb15: {
274 // StorageDead(_2);
275 // StorageDead(_1);
276 // _0 = ();
277 // return;
278 // }
279 // END rustc.main.PromoteTemps.before.mir