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