Skip to content

Commit 7718b14

Browse files
committed
Test StorageDead statements explicitly
1 parent 4d6cb09 commit 7718b14

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
// ignore-wasm32-bare compiled with panic=abort by default
2+
3+
// Test that we generate StorageDead on unwind paths for generators.
4+
//
5+
// Basic block and local names can safely change, but the StorageDead statements
6+
// should not go away.
7+
8+
#![feature(generators, generator_trait)]
9+
10+
struct Foo(i32);
11+
12+
impl Drop for Foo {
13+
fn drop(&mut self) {}
14+
}
15+
16+
struct Bar(i32);
17+
18+
fn take<T>(_x: T) {}
19+
20+
fn main() {
21+
let _gen = || {
22+
let a = Foo(5);
23+
let b = Bar(6);
24+
yield;
25+
take(a);
26+
take(b);
27+
};
28+
}
29+
30+
// END RUST SOURCE
31+
32+
// START rustc.main-{{closure}}.StateTransform.before.mir
33+
// ...
34+
// let _2: Foo;
35+
// ...
36+
// let mut _7: Foo;
37+
// ...
38+
// let mut _9: Bar;
39+
// scope 1 {
40+
// let _3: Bar;
41+
// scope 2 {
42+
// }
43+
// }
44+
// bb0: {
45+
// StorageLive(_2);
46+
// _2 = Foo(const 5i32,);
47+
// StorageLive(_3);
48+
// _3 = Bar(const 6i32,);
49+
// ...
50+
// _1 = suspend(move _5) -> [resume: bb2, drop: bb4];
51+
// }
52+
// bb1 (cleanup): {
53+
// resume;
54+
// }
55+
// bb2: {
56+
// ...
57+
// StorageLive(_7);
58+
// _7 = move _2;
59+
// _6 = const take::<Foo>(move _7) -> [return: bb9, unwind: bb8];
60+
// }
61+
// bb3 (cleanup): {
62+
// StorageDead(_2);
63+
// drop(_1) -> bb1;
64+
// }
65+
// bb4: {
66+
// ...
67+
// StorageDead(_3);
68+
// drop(_2) -> [return: bb5, unwind: bb3];
69+
// }
70+
// bb5: {
71+
// StorageDead(_2);
72+
// drop(_1) -> [return: bb6, unwind: bb1];
73+
// }
74+
// bb6: {
75+
// generator_drop;
76+
// }
77+
// bb7 (cleanup): {
78+
// StorageDead(_3);
79+
// StorageDead(_2);
80+
// drop(_1) -> bb1;
81+
// }
82+
// bb8 (cleanup): {
83+
// StorageDead(_7);
84+
// goto -> bb7;
85+
// }
86+
// bb9: {
87+
// StorageDead(_7);
88+
// StorageLive(_9);
89+
// _9 = move _3;
90+
// _8 = const take::<Bar>(move _9) -> [return: bb10, unwind: bb11];
91+
// }
92+
// bb10: {
93+
// StorageDead(_9);
94+
// ...
95+
// StorageDead(_3);
96+
// StorageDead(_2);
97+
// drop(_1) -> [return: bb12, unwind: bb1];
98+
// }
99+
// bb11 (cleanup): {
100+
// StorageDead(_9);
101+
// goto -> bb7;
102+
// }
103+
// bb12: {
104+
// return;
105+
// }
106+
// END rustc.main-{{closure}}.StateTransform.before.mir

0 commit comments

Comments
 (0)