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