]> git.lizzy.rs Git - rust.git/blob - src/test/mir-opt/generator-storage-dead-unwind.rs
bcdb93754271681ee504804e9de1fe66c55402ef
[rust.git] / src / test / mir-opt / generator-storage-dead-unwind.rs
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(_6);
58 //     StorageLive(_7);
59 //     _7 = move _2;
60 //     _6 = const take::<Foo>(move _7) -> [return: bb9, unwind: bb8];
61 // }
62 // bb3 (cleanup): {
63 //     StorageDead(_2);
64 //     drop(_1) -> bb1;
65 // }
66 // bb4: {
67 //     ...
68 //     StorageDead(_3);
69 //     drop(_2) -> [return: bb5, unwind: bb3];
70 // }
71 // bb5: {
72 //     StorageDead(_2);
73 //     drop(_1) -> [return: bb6, unwind: bb1];
74 // }
75 // bb6: {
76 //     generator_drop;
77 // }
78 // bb7 (cleanup): {
79 //     StorageDead(_3);
80 //     StorageDead(_2);
81 //     drop(_1) -> bb1;
82 // }
83 // bb8 (cleanup): {
84 //     StorageDead(_7);
85 //     StorageDead(_6);
86 //     goto -> bb7;
87 // }
88 // bb9: {
89 //     StorageDead(_7);
90 //     StorageDead(_6);
91 //     StorageLive(_8);
92 //     StorageLive(_9);
93 //     _9 = move _3;
94 //     _8 = const take::<Bar>(move _9) -> [return: bb10, unwind: bb11];
95 // }
96 // bb10: {
97 //     StorageDead(_9);
98 //     StorageDead(_8);
99 //     ...
100 //     StorageDead(_3);
101 //     StorageDead(_2);
102 //     drop(_1) -> [return: bb12, unwind: bb1];
103 // }
104 // bb11 (cleanup): {
105 //     StorageDead(_9);
106 //     StorageDead(_8);
107 //     goto -> bb7;
108 // }
109 // bb12: {
110 //     return;
111 // }
112 // END rustc.main-{{closure}}.StateTransform.before.mir