File tree 1 file changed +44
-0
lines changed
src/test/run-pass/generator
1 file changed +44
-0
lines changed Original file line number Diff line number Diff line change
1
+ // Regression test for incorrect DropAndReplace behavior introduced in #60840
2
+ // and fixed in #61373. When combined with the optimization implemented in
3
+ // #60187, this produced incorrect code for generators when a saved local was
4
+ // re-assigned.
5
+
6
+ #![ feature( generators, generator_trait) ]
7
+
8
+ use std:: ops:: { Generator , GeneratorState } ;
9
+ use std:: pin:: Pin ;
10
+
11
+ #[ derive( Debug , PartialEq ) ]
12
+ struct Foo ( i32 ) ;
13
+
14
+ impl Drop for Foo {
15
+ fn drop ( & mut self ) { }
16
+ }
17
+
18
+ fn main ( ) {
19
+ let mut a = || {
20
+ let mut x = Foo ( 4 ) ;
21
+ yield ;
22
+ assert_eq ! ( x. 0 , 4 ) ;
23
+
24
+ // At one point this tricked our dataflow analysis into thinking `x` was
25
+ // StorageDead after the assignment.
26
+ x = Foo ( 5 ) ;
27
+ assert_eq ! ( x. 0 , 5 ) ;
28
+
29
+ {
30
+ let y = Foo ( 6 ) ;
31
+ yield ;
32
+ assert_eq ! ( y. 0 , 6 ) ;
33
+ }
34
+
35
+ assert_eq ! ( x. 0 , 5 ) ;
36
+ } ;
37
+
38
+ loop {
39
+ match Pin :: new ( & mut a) . resume ( ) {
40
+ GeneratorState :: Complete ( ( ) ) => break ,
41
+ _ => ( ) ,
42
+ }
43
+ }
44
+ }
You can’t perform that action at this time.
0 commit comments