| The `DispatchFromDyn` trait was implemented on something which is not a pointer |
| or a newtype wrapper around a pointer. |
| |
| Erroneous code example: |
| |
| ```compile_fail,E0378 |
| #![feature(dispatch_from_dyn)] |
| use std::ops::DispatchFromDyn; |
| |
| struct WrapperExtraField<T> { |
| ptr: T, |
| extra_stuff: i32, |
| } |
| |
| impl<T, U> DispatchFromDyn<WrapperExtraField<U>> for WrapperExtraField<T> |
| where |
| T: DispatchFromDyn<U>, |
| {} |
| ``` |
| |
| The `DispatchFromDyn` trait currently can only be implemented for |
| builtin pointer types and structs that are newtype wrappers around them |
| — that is, the struct must have only one field (except for `PhantomData`), |
| and that field must itself implement `DispatchFromDyn`. |
| |
| ``` |
| #![feature(dispatch_from_dyn, unsize)] |
| use std::{ |
| marker::Unsize, |
| ops::DispatchFromDyn, |
| }; |
| |
| struct Ptr<T: ?Sized>(*const T); |
| |
| impl<T: ?Sized, U: ?Sized> DispatchFromDyn<Ptr<U>> for Ptr<T> |
| where |
| T: Unsize<U>, |
| {} |
| ``` |
| |
| Another example: |
| |
| ``` |
| #![feature(dispatch_from_dyn)] |
| use std::{ |
| ops::DispatchFromDyn, |
| marker::PhantomData, |
| }; |
| |
| struct Wrapper<T> { |
| ptr: T, |
| _phantom: PhantomData<()>, |
| } |
| |
| impl<T, U> DispatchFromDyn<Wrapper<U>> for Wrapper<T> |
| where |
| T: DispatchFromDyn<U>, |
| {} |
| ``` |