#![allow(unreachable_code)] use drop_cell::defer; fn main() { none(); single(); multiple(); bindings(); } fn none() { let (tx, rx) = std::sync::mpsc::channel(); defer! { tx.send("world").unwrap(); assert_eq!(rx.recv().unwrap(), "hello"); assert_eq!(rx.recv().unwrap(), "world"); } tx.send("hello").unwrap(); return; tx.send("unreachable").unwrap(); } fn single() { let v = vec![]; defer! { v => v.push("world"); assert_eq!(v.as_slice(), &["hello", "world"]); }; v.push("hello"); return; v.push("unreachable"); } fn multiple() { let v1 = vec![]; let v2 = vec![]; defer! { v1, v2 => v1.push("world"); v2.push("world"); assert_eq!(v1.as_slice(), &["hello", "world"]); assert_eq!(v2.as_slice(), &["hello", "world"]); }; v1.push("hello"); v2.push("hello"); return; v1.push("unreachable"); v2.push("unreachable"); } fn bindings() { let v1 = vec![]; let foo = vec![]; defer! { v1, v2 @ foo, v3 @ vec![] => v1.push("world"); v2.push("world"); v3.push("world"); assert_eq!(v1.as_slice(), &["hello", "world"]); assert_eq!(v2.as_slice(), &["hello", "world"]); assert_eq!(v3.as_slice(), &["hello", "world"]); }; v1.push("hello"); v2.push("hello"); v3.push("hello"); return; v1.push("unreachable"); v2.push("unreachable"); v3.push("unreachable"); }