File tree 1 file changed +106
-0
lines changed
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