mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 15:23:46 +00:00
Rollup merge of #91637 - tmiasko:generator-packed-drop, r=ecstatic-morse
Add test for packed drops in generators r? ```@ecstatic-morse```
This commit is contained in:
commit
1aa2007eca
@ -1,6 +1,10 @@
|
||||
// run-pass
|
||||
#![feature(generators)]
|
||||
#![feature(generator_trait)]
|
||||
use std::cell::Cell;
|
||||
use std::mem;
|
||||
use std::ops::Generator;
|
||||
use std::pin::Pin;
|
||||
|
||||
struct Aligned<'a> {
|
||||
drop_count: &'a Cell<usize>
|
||||
@ -19,15 +23,35 @@ impl<'a> Drop for Aligned<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(transparent)]
|
||||
struct NotCopy(u8);
|
||||
|
||||
#[repr(packed)]
|
||||
struct Packed<'a>(u8, Aligned<'a>);
|
||||
struct Packed<'a>(NotCopy, Aligned<'a>);
|
||||
|
||||
fn main() {
|
||||
let drop_count = &Cell::new(0);
|
||||
{
|
||||
let mut p = Packed(0, Aligned { drop_count });
|
||||
let mut p = Packed(NotCopy(0), Aligned { drop_count });
|
||||
p.1 = Aligned { drop_count };
|
||||
assert_eq!(drop_count.get(), 1);
|
||||
}
|
||||
assert_eq!(drop_count.get(), 2);
|
||||
|
||||
let drop_count = &Cell::new(0);
|
||||
let mut g = || {
|
||||
let mut p = Packed(NotCopy(0), Aligned { drop_count });
|
||||
let _ = &p;
|
||||
p.1 = Aligned { drop_count };
|
||||
assert_eq!(drop_count.get(), 1);
|
||||
// Test that a generator drop function moves a value from a packed
|
||||
// struct to a separate local before dropping it. We move out the
|
||||
// first field to generate and open drop for the second field.
|
||||
drop(p.0);
|
||||
yield;
|
||||
};
|
||||
Pin::new(&mut g).resume(());
|
||||
assert_eq!(drop_count.get(), 1);
|
||||
drop(g);
|
||||
assert_eq!(drop_count.get(), 2);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user