calling_drop/
calling_drop.rs1use replace_drop::{ReplaceDrop, ReplaceDropImpl};
2
3struct Inner;
4
5impl Drop for Inner {
6 fn drop(&mut self) {
7 println!("Inner!");
8 }
9}
10
11struct Outer(Inner);
12
13impl Drop for Outer {
14 fn drop(&mut self) {
15 println!("Outer!");
16 }
17}
18
19unsafe impl ReplaceDropImpl for Inner {
20 unsafe fn drop(&mut self) {
21 println!("Inner 2!");
22 }
23}
24
25unsafe impl ReplaceDropImpl for Outer {
26 unsafe fn drop(&mut self) {
27 println!("Outer 2!");
28
29 std::ptr::drop_in_place(&mut self.0 as *mut _);
34
35 ReplaceDropImpl::drop(&mut self.0);
37
38 std::ptr::drop_in_place(self as *mut _);
40 }
41}
42
43fn main() {
44 let _ = ReplaceDrop::new(Outer(Inner));
45 }