1 //! Tests that panics inside a generator will correctly drop the initial resume argument.
6 #![feature(generators, generator_trait)]
8 use std::ops::Generator;
9 use std::panic::{catch_unwind, AssertUnwindSafe};
11 use std::sync::atomic::{AtomicUsize, Ordering};
13 static DROP: AtomicUsize = AtomicUsize::new(0);
17 impl Drop for Dropper {
19 DROP.fetch_add(1, Ordering::SeqCst);
24 let mut gen = |_arg| {
30 let mut gen = Pin::new(&mut gen);
32 assert_eq!(DROP.load(Ordering::Acquire), 0);
33 let res = catch_unwind(AssertUnwindSafe(|| gen.as_mut().resume(Dropper {})));
34 assert!(res.is_err());
35 assert_eq!(DROP.load(Ordering::Acquire), 1);