Skip to content

Commit

Permalink
Add test for packed drops in generators
Browse files Browse the repository at this point in the history
  • Loading branch information
tmiasko committed Dec 7, 2021
1 parent 0b6f079 commit 3cbe0f1
Showing 1 changed file with 26 additions and 2 deletions.
28 changes: 26 additions & 2 deletions src/test/ui/packed/packed-struct-drop-aligned.rs
@@ -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>
Expand All @@ -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);
}

0 comments on commit 3cbe0f1

Please sign in to comment.