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