// Check that a self parameter type requires a DispatchFromDyn impl to be object safe #![feature(arbitrary_self_types, unsize, coerce_unsized)] use std::{ marker::Unsize, ops::{CoerceUnsized, Deref}, }; struct Ptr<T: ?Sized>(Box<T>); impl<T: ?Sized> Deref for Ptr<T> { type Target = T; fn deref(&self) -> &T { &*self.0 } } impl<T: Unsize<U> + ?Sized, U: ?Sized> CoerceUnsized<Ptr<U>> for Ptr<T> {} // Because this impl is missing the coercion below fails. // impl<T: Unsize<U> + ?Sized, U: ?Sized> DispatchFromDyn<Ptr<U>> for Ptr<T> {} trait Trait { fn ptr(self: Ptr<Self>); } impl Trait for i32 { fn ptr(self: Ptr<Self>) {} } fn main() { Ptr(Box::new(4)) as Ptr<dyn Trait>; //~^ ERROR the trait `Trait` cannot be made into an object //~^^ ERROR the trait `Trait` cannot be made into an object }