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.