| // Check that a self parameter type requires a DispatchFromDyn impl to be dyn-compatible. |
| |
| #![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 |
| } |