diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2021-12-08 23:18:06 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-08 23:18:06 +0100 |
| commit | 1aa2007eca41c18930922b4eaa061e7f6183ef56 (patch) | |
| tree | 79b0ca5118985493cb554e9635d3f1f7eae146e3 | |
| parent | d748c1ddbbbf118240653608f4d7d01307bfaa83 (diff) | |
| parent | 3cbe0f1b48dfdb7866f45a1d683b1391ed4d0508 (diff) | |
| download | rust-1aa2007eca41c18930922b4eaa061e7f6183ef56.tar.gz rust-1aa2007eca41c18930922b4eaa061e7f6183ef56.zip | |
Rollup merge of #91637 - tmiasko:generator-packed-drop, r=ecstatic-morse
Add test for packed drops in generators r? ```@ecstatic-morse```
| -rw-r--r-- | src/test/ui/packed/packed-struct-drop-aligned.rs | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/test/ui/packed/packed-struct-drop-aligned.rs b/src/test/ui/packed/packed-struct-drop-aligned.rs index fab3bbedac6..b95cdbbbaad 100644 --- a/src/test/ui/packed/packed-struct-drop-aligned.rs +++ b/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> @@ -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); } |
