blob: cd2b26260a8af49c1b5e4eb24883585ac32ee2ea [file] [log] [blame] [view]
`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.