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