@@ -51,13 +51,13 @@ An example implementation:
51
51
52
52
```
53
53
impl<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> {}
55
55
56
56
// For reference, the definitions of Rc and NonZero:
57
57
pub struct Rc<T: ?Sized> {
58
58
_ptr: NonZero<*mut RcBox<T>>,
59
59
}
60
- pub struct NonZero<T: Zeroable+?Sized >(T);
60
+ pub struct NonZero<T: Zeroable>(T);
61
61
```
62
62
63
63
Implementing ` CoerceUnsized ` indicates that the self type should be able to be
@@ -75,24 +75,18 @@ fn foo<T: CoerceUnsized<U>, U>(x: T) -> U {
75
75
Built-in pointer impls:
76
76
77
77
```
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 {}
83
82
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 {}
88
85
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 {}
91
88
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 {}
96
90
```
97
91
98
92
Note that there are some coercions which are not given by ` CoerceUnsized ` , e.g.,
0 commit comments