mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +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