From: Ralf Jung Date: Tue, 3 Mar 2020 14:00:19 +0000 (+0100) Subject: try even harder to catch invalid generator fields X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=58519a7a7930d4ac494d971a737525221c70f26a;p=rust.git try even harder to catch invalid generator fields --- diff --git a/tests/run-pass/generator.rs b/tests/run-pass/generator.rs index e85d2cf8f29..18eaf5e55c1 100644 --- a/tests/run-pass/generator.rs +++ b/tests/run-pass/generator.rs @@ -4,6 +4,8 @@ use std::pin::Pin; use std::sync::atomic::{AtomicUsize, Ordering}; use std::fmt::Debug; +use std::mem::ManuallyDrop; +use std::ptr; fn basic() { fn finish(mut amt: usize, mut t: T) -> T::Return @@ -12,8 +14,13 @@ fn finish(mut amt: usize, mut t: T) -> T::Return // We are not moving the `t` around until it gets dropped, so this is okay. let mut t = unsafe { Pin::new_unchecked(&mut t) }; loop { - match t.as_mut().resume(()) { - GeneratorState::Yielded(y) => amt -= y, + let state = t.as_mut().resume(()); + // Test if the generator is valid (according to type invariants). + let _ = unsafe { ManuallyDrop::new(ptr::read(t.as_mut().get_unchecked_mut())) }; + match state { + GeneratorState::Yielded(y) => { + amt -= y; + } GeneratorState::Complete(ret) => { assert_eq!(amt, 0); return ret @@ -109,6 +116,8 @@ fn drain + Unpin, R, Y>( for (input, out) in inout { assert_eq!(gen.as_mut().resume(input), out); + // Test if the generator is valid (according to type invariants). + let _ = unsafe { ManuallyDrop::new(ptr::read(gen.as_mut().get_unchecked_mut())) }; } }