1 // https://discord.com/channels/273534239310479360/512792629516173323/870075511009857617 2 3 extern crate pin_project as pin_project_orig; 4 extern crate self as pin_project; 5 6 pub use ::pin_project_orig::*; 7 mod __private { 8 pub use ::pin_project_orig::__private::*; 9 pub trait Drop {} 10 } 11 12 use std::{marker::PhantomPinned, mem}; 13 14 #[pin_project] //~ ERROR conflicting implementations of trait `_::FooMustNotImplDrop` 15 struct S { 16 #[pin] 17 f: (u8, PhantomPinned), 18 } 19 20 impl Drop for S { drop(&mut self)21 fn drop(&mut self) { 22 let prev = &self.f.0 as *const _ as usize; 23 let moved = mem::take(&mut self.f); // move pinned field 24 let moved = &moved.0 as *const _ as usize; 25 assert_eq!(prev, moved); // panic 26 } 27 } 28 main()29fn main() { 30 let mut x = Box::pin(S { f: (1, PhantomPinned) }); 31 let _f = x.as_mut().project().f; // first mutable access 32 } 33