#![allow(dead_code, deprecated, unused_variables, unused_mut)] #![feature(arbitrary_self_types, derive_coerce_pointee)] use std::marker::CoercePointee; use std::ops::Deref; #[derive(CoercePointee)] #[repr(transparent)] struct MySmartPointer(Box); impl Deref for MySmartPointer { type Target = T; fn deref(&self) -> &T { &self.0 } } trait MyTrait { fn func(self: MySmartPointer); } fn call_func(value: MySmartPointer) { value.func(); } fn main() {}