2019-07-26 21:54:25 +00:00
|
|
|
// run-pass
|
2019-05-22 22:17:38 +00:00
|
|
|
// Regression test for incorrect DropAndReplace behavior introduced in #60840
|
|
|
|
// and fixed in #61373. When combined with the optimization implemented in
|
|
|
|
// #60187, this produced incorrect code for generators when a saved local was
|
|
|
|
// re-assigned.
|
|
|
|
|
|
|
|
#![feature(generators, generator_trait)]
|
|
|
|
|
|
|
|
use std::ops::{Generator, GeneratorState};
|
|
|
|
use std::pin::Pin;
|
|
|
|
|
|
|
|
#[derive(Debug, PartialEq)]
|
|
|
|
struct Foo(i32);
|
|
|
|
|
|
|
|
impl Drop for Foo {
|
|
|
|
fn drop(&mut self) { }
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let mut a = || {
|
|
|
|
let mut x = Foo(4);
|
|
|
|
yield;
|
|
|
|
assert_eq!(x.0, 4);
|
|
|
|
|
|
|
|
// At one point this tricked our dataflow analysis into thinking `x` was
|
|
|
|
// StorageDead after the assignment.
|
|
|
|
x = Foo(5);
|
|
|
|
assert_eq!(x.0, 5);
|
|
|
|
|
|
|
|
{
|
|
|
|
let y = Foo(6);
|
|
|
|
yield;
|
|
|
|
assert_eq!(y.0, 6);
|
|
|
|
}
|
|
|
|
|
|
|
|
assert_eq!(x.0, 5);
|
|
|
|
};
|
|
|
|
|
|
|
|
loop {
|
2020-01-25 19:03:10 +00:00
|
|
|
match Pin::new(&mut a).resume(()) {
|
2019-05-22 22:17:38 +00:00
|
|
|
GeneratorState::Complete(()) => break,
|
|
|
|
_ => (),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|