3 #![allow(unused_assignments)]
4 #![allow(unused_variables)]
5 // ignore-emscripten no threads support
7 #![feature(box_syntax)]
10 use std::sync::mpsc::{channel, Sender};
12 #[derive(PartialEq, Debug)]
19 sender: Sender<Message>
22 impl Drop for SendOnDrop {
24 self.sender.send(Message::Dropped).unwrap();
29 SimpleVariant(Sender<Message>),
30 NestedVariant(Box<usize>, SendOnDrop, Sender<Message>),
31 FailingVariant { on_drop: SendOnDrop }
37 &mut Foo::SimpleVariant(ref mut sender) => {
38 sender.send(Message::DestructorRan).unwrap();
40 &mut Foo::NestedVariant(_, _, ref mut sender) => {
41 sender.send(Message::DestructorRan).unwrap();
43 &mut Foo::FailingVariant { .. } => {
51 let (sender, receiver) = channel();
53 let v = Foo::SimpleVariant(sender);
55 assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
56 assert_eq!(receiver.recv().ok(), None);
58 let (sender, receiver) = channel();
60 let v = Foo::NestedVariant(box 42, SendOnDrop { sender: sender.clone() }, sender);
62 assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
63 assert_eq!(receiver.recv().unwrap(), Message::Dropped);
64 assert_eq!(receiver.recv().ok(), None);
66 let (sender, receiver) = channel();
67 let t = thread::spawn(move|| {
68 let v = Foo::FailingVariant { on_drop: SendOnDrop { sender: sender } };
70 assert_eq!(receiver.recv().unwrap(), Message::Dropped);
71 assert_eq!(receiver.recv().ok(), None);
74 let (sender, receiver) = channel();
76 thread::spawn(move|| {
77 let mut v = Foo::NestedVariant(box 42, SendOnDrop {
78 sender: sender.clone()
80 v = Foo::NestedVariant(box 42,
81 SendOnDrop { sender: sender.clone() },
83 v = Foo::SimpleVariant(sender.clone());
84 v = Foo::FailingVariant { on_drop: SendOnDrop { sender: sender } };
87 assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
88 assert_eq!(receiver.recv().unwrap(), Message::Dropped);
89 assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
90 assert_eq!(receiver.recv().unwrap(), Message::Dropped);
91 assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
92 assert_eq!(receiver.recv().unwrap(), Message::Dropped);
93 assert_eq!(receiver.recv().ok(), None);