| `CoerceUnsized` or `DispatchFromDyn` may only be implemented between structs | |
| of the same type. | |
| Example of erroneous code: | |
| ```compile_fail,E0377 | |
| #![feature(coerce_unsized)] | |
| use std::ops::CoerceUnsized; | |
| pub struct Foo<T: ?Sized> { | |
| field_with_unsized_type: T, | |
| } | |
| pub struct Bar<T: ?Sized> { | |
| field_with_unsized_type: T, | |
| } | |
| // error: the trait `CoerceUnsized` may only be implemented for a coercion | |
| // between structures with the same definition | |
| impl<T, U> CoerceUnsized<Bar<U>> for Foo<T> where T: CoerceUnsized<U> {} | |
| ``` | |
| `CoerceUnsized` is used to coerce structs that have a field that can be unsized, | |
| like a custom `MyBox<T>` being unsized to `MyBox<dyn Trait>`. `DispatchFromDyn` | |
| is used to dispatch from `MyBox<dyn Trait>` to `MyBox<Self>` in a dyn-compatible | |
| trait. | |
| The compiler cannot support coercions between structs of different types, so | |
| a valid implementation of `CoerceUnsized` or `DispatchFromDyn` should be | |
| implemented between the same struct with different generic parameters. | |
| Note that `CoerceUnsized` and `DispatchFromDyn` is mainly used by smart pointers | |
| like `Box`, `Rc` and `Arc` to be able to mark that they can coerce unsized types | |
| that they are pointing at. |