]> git.lizzy.rs Git - rust.git/blob - src/test/mir-opt/match_false_edges.rs
Rollup merge of #62514 - stephaneyfx:box-ffi, r=nikomatsakis
[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 //      _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