@@ -51,13 +51,13 @@ An example implementation:
5151
5252```
5353impl<T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<Rc<U>> for Rc<T> {}
54- impl<T: ?Sized +CoerceUnsized<U>, U: ?Sized > CoerceUnsized<NonZero<U>> for NonZero<T> {}
54+ impl<T: Zeroable +CoerceUnsized<U>, U: Zeroable > CoerceUnsized<NonZero<U>> for NonZero<T> {}
5555
5656// For reference, the definitions of Rc and NonZero:
5757pub struct Rc<T: ?Sized> {
5858 _ptr: NonZero<*mut RcBox<T>>,
5959}
60- pub struct NonZero<T: Zeroable+?Sized >(T);
60+ pub struct NonZero<T: Zeroable>(T);
6161```
6262
6363Implementing ` CoerceUnsized ` indicates that the self type should be able to be
@@ -75,24 +75,18 @@ fn foo<T: CoerceUnsized<U>, U>(x: T) -> U {
7575Built-in pointer impls:
7676
7777```
78- impl<T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<Box<U>> for Box<T> {}
79- impl<T: ?Sized+Unsize<U>, U: ?Sized, 'a> CoerceUnsized<&'a U> for Box<T> {}
80- impl<T: ?Sized+Unsize<U>, U: ?Sized, 'a> CoerceUnsized<&mut 'a U> for Box<T> {}
81- impl<T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for Box<T> {}
82- impl<T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<*mut U> for Box<T> {}
78+ impl<'a, 'b: 'aT: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<&'a U> for &'b mut T {}
79+ impl<'a, T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<&'a mut U> for &'a mut T {}
80+ impl<'a, T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for &'a mut T {}
81+ impl<'a, T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<*mut U> for &'a mut T {}
8382
84- impl<T: ?Sized+Unsize<U>, U: ?Sized, 'a, 'b: 'a> CoerceUnsized<&'a U> for &mut 'b U {}
85- impl<T: ?Sized+Unsize<U>, U: ?Sized, 'a> CoerceUnsized<&mut 'a U> for &mut 'a U {}
86- impl<T: ?Sized+Unsize<U>, U: ?Sized, 'a> CoerceUnsized<*const U> for &mut 'a U {}
87- impl<T: ?Sized+Unsize<U>, U: ?Sized, 'a> CoerceUnsized<*mut U> for &mut 'a U {}
83+ impl<'a, 'b: 'a, T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<&'a U> for &'b T {}
84+ impl<'b, T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for &'b T {}
8885
89- impl<T: ?Sized+Unsize<U>, U: ?Sized, 'a, 'b > CoerceUnsized<&'a U> for &'b U {}
90- impl<T: ?Sized+Unsize<U>, U: ?Sized, 'b > CoerceUnsized<*const U> for &'b U {}
86+ impl<T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for *mut T {}
87+ impl<T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<*mut U> for *mut T {}
9188
92- impl<T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for *mut U {}
93- impl<T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<*mut U> for *mut U {}
94-
95- impl<T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for *const U {}
89+ impl<T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<*const U> for *const T {}
9690```
9791
9892Note that there are some coercions which are not given by ` CoerceUnsized ` , e.g.,
0 commit comments