| `CoerceUnsized` or `DispatchFromDyn` was implemented on a struct which does not |
| contain a field that is being unsized. |
| |
| Example of erroneous code: |
| |
| ```compile_fail,E0374 |
| #![feature(coerce_unsized)] |
| use std::ops::CoerceUnsized; |
| |
| struct Foo<T: ?Sized> { |
| a: i32, |
| } |
| |
| // error: Struct `Foo` has no unsized fields that need to be coerced. |
| impl<T, U> CoerceUnsized<Foo<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. |
| |
| If the struct doesn't have any fields of unsized types then there is no |
| meaningful way to implement `CoerceUnsized` or `DispatchFromDyn`, since |
| there is no coercion taking place. |
| |
| 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. |