Error code E0377
CoerceUnsized or DispatchFromDyn may only be implemented between structs
of the same type.
Example of erroneous code:
#![allow(unused)] #![feature(coerce_unsized)] fn main() { 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.