Skip to content

Commit e9ad4fe

Browse files
committed
Add test for DropAndReplace bug
1 parent a09f605 commit e9ad4fe

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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+
}

0 commit comments

Comments
 (0)