#![feature(unsafe_binders)] //~^ WARN the feature `unsafe_binders` is incomplete use std::mem::{ManuallyDrop, drop}; use std::unsafe_binder::{unwrap_binder, wrap_binder}; #[derive(Default)] struct NotCopyInner; type NotCopy = ManuallyDrop; fn use_after_wrap() { unsafe { let base = NotCopy::default(); let binder: unsafe<> NotCopy = wrap_binder!(base); drop(base); //~^ ERROR use of moved value: `base` } } fn move_out_of_wrap() { unsafe { let binder: unsafe<> NotCopy = wrap_binder!(NotCopy::default()); drop(unwrap_binder!(binder)); drop(unwrap_binder!(binder)); //~^ ERROR use of moved value: `binder` } } fn not_conflicting() { unsafe { let binder: unsafe<> (NotCopy, NotCopy) = wrap_binder!((NotCopy::default(), NotCopy::default())); drop(unwrap_binder!(binder).0); drop(unwrap_binder!(binder).1); // ^ NOT a problem, since the moves are disjoint. drop(unwrap_binder!(binder).0); //~^ ERROR use of moved value: `binder.0` } } fn main() {}