File tree Expand file tree Collapse file tree 1 file changed +104
-0
lines changed Expand file tree Collapse file tree 1 file changed +104
-0
lines changed Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments