]> git.lizzy.rs Git - rust.git/blob - src/test/mir-opt/generator-storage-dead-unwind.rs
Rollup merge of #68487 - 0dvictor:nolink, r=tmandry
[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 _3: Foo;
35 // ...
36 // let mut _8: Foo;
37 // ...
38 // let mut _10: Bar;
39 // scope 1 {
40 //     debug a => _3;
41 //     let _4: Bar;
42 //     scope 2 {
43 //         debug b => _4;
44 //     }
45 // }
46 // bb0: {
47 //     StorageLive(_3);
48 //     _3 = Foo(const 5i32,);
49 //     StorageLive(_4);
50 //     _4 = Bar(const 6i32,);
51 //     ...
52 //     _1 = suspend(move _6) -> [resume: bb2, drop: bb4];
53 // }
54 // bb1 (cleanup): {
55 //     resume;
56 // }
57 // bb2: {
58 //     ...
59 //     StorageLive(_7);
60 //     StorageLive(_8);
61 //     _8 = move _3;
62 //     _7 = const take::<Foo>(move _8) -> [return: bb7, unwind: bb9];
63 // }
64 // bb3 (cleanup): {
65 //     StorageDead(_3);
66 //     drop(_1) -> bb1;
67 // }
68 // bb4: {
69 //     ...
70 //     StorageDead(_4);
71 //     drop(_3) -> [return: bb5, unwind: bb3];
72 // }
73 // bb5: {
74 //     StorageDead(_3);
75 //     drop(_1) -> [return: bb6, unwind: bb1];
76 // }
77 // bb6: {
78 //     generator_drop;
79 // }
80 // bb7: {
81 //     StorageDead(_8);
82 //     StorageDead(_7);
83 //     StorageLive(_9);
84 //     StorageLive(_10);
85 //     _10 = move _4;
86 //     _9 = const take::<Bar>(move _10) -> [return: bb10, unwind: bb11];
87 // }
88 // bb8 (cleanup): {
89 //     StorageDead(_4);
90 //     StorageDead(_3);
91 //     drop(_1) -> bb1;
92 // }
93 // bb9 (cleanup): {
94 //     StorageDead(_8);
95 //     StorageDead(_7);
96 //     goto -> bb8;
97 // }
98 // bb10: {
99 //     StorageDead(_10);
100 //     StorageDead(_9);
101 //     ...
102 //     StorageDead(_4);
103 //     StorageDead(_3);
104 //     drop(_1) -> [return: bb12, unwind: bb1];
105 // }
106 // bb11 (cleanup): {
107 //     StorageDead(_10);
108 //     StorageDead(_9);
109 //     goto -> bb8;
110 // }
111 // bb12: {
112 //     return;
113 // }
114 // END rustc.main-{{closure}}.StateTransform.before.mir