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.