Skip to content

Commit 20fffc8

Browse files
committed
Test StorageDead statements explicitly
1 parent 4d6cb09 commit 20fffc8

File tree

1 file changed

+104
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)