Error code E0377
The trait CoerceUnsized may only be implemented for a coercion between
structures with the same definition.
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> {} }
When attempting to implement CoerceUnsized, the impl signature must look
like: impl CoerceUnsized<Type<U>> for Type<T> where T: CoerceUnsized<U>;
the implementer and CoerceUnsized type parameter must be the same
type. In this example, Bar and Foo (even though structurally identical)
are not the same type and are rejected. Learn more about the CoerceUnsized
trait and DST coercion in
the CoerceUnsized docs.