@@ -2710,6 +2710,35 @@ mod impls {
2710
2710
2711
2711
/// Trait that indicates that this is a pointer or a wrapper for one,
2712
2712
/// where unsizing can be performed on the pointee.
2713
+ ///
2714
+ /// See the [DST coercion RfC][dst-coerce] and [the nomicon entry on coercion][nomicon-coerce]
2715
+ /// for more details.
2716
+ ///
2717
+ /// For builtin pointer types, pointers to `T` will coerce to pointers to `U` if `T: Unsize<U>`
2718
+ /// by converting from a thin pointer to a fat pointer.
2719
+ ///
2720
+ /// For custom types, the coercion here works by coercing `Foo<T>` to `Foo<U>`
2721
+ /// provided an impl of `CoerceUnsized<Foo<U>> for Foo<T>` exists.
2722
+ /// Such an impl can only be written if `Foo<T>` has only a single non-phantomdata
2723
+ /// field involving `T`. If the type of that field is `Bar<T>`, an implementation
2724
+ /// of `CoerceUnsized<Bar<U>> for Bar<T>` must exist. The coercion will work by
2725
+ /// by coercing the `Bar<T>` field into `Bar<U>` and filling in the rest of the fields
2726
+ /// from `Foo<T>` to create a `Foo<U>`. This will effectively drill down to a pointer
2727
+ /// field and coerce that.
2728
+ ///
2729
+ /// Generally, for smart pointers you will implement
2730
+ /// `CoerceUnsized<Ptr<U>> for Ptr<T> where T: Unsize<U>, U: ?Sized`, with an
2731
+ /// optional `?Sized` bound on `T` itself. For wrapper types that directly embed `T`
2732
+ /// like `Cell<T>` and `RefCell<T>`, you
2733
+ /// can directly implement `CoerceUnsized<Wrap<U>> for Wrap<T> where T: CoerceUnsized<U>`.
2734
+ /// This will let coercions of types like `Cell<Box<T>>` work.
2735
+ ///
2736
+ /// [`Unsize`][unsize] is used to mark types which can be coerced to DSTs if behind
2737
+ /// pointers. It is implemented automatically by the compiler.
2738
+ ///
2739
+ /// [dst-coerce]: https://github.com/rust-lang/rfcs/blob/master/text/0982-dst-coercion.md
2740
+ /// [unsize]: ../marker/trait.Unsize.html
2741
+ /// [nomicon-coerce]: ../../nomicon/coercions.html
2713
2742
#[ unstable( feature = "coerce_unsized" , issue = "27732" ) ]
2714
2743
#[ lang="coerce_unsized" ]
2715
2744
pub trait CoerceUnsized < T > {
0 commit comments