mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 10:13:54 +00:00
Add test for DropAndReplace bug
This commit is contained in:
parent
e8d639e42f
commit
e244f625be
44
src/test/run-pass/generator/drop-and-replace.rs
Normal file
44
src/test/run-pass/generator/drop-and-replace.rs
Normal file
@ -0,0 +1,44 @@
|
||||
// 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 {
|
||||
match Pin::new(&mut a).resume() {
|
||||
GeneratorState::Complete(()) => break,
|
||||
_ => (),
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user