]>
Commit | Line | Data |
---|---|---|
29967ef6 XL |
1 | // Adapted from rustc run-pass test suite |
2 | ||
6a06907d | 3 | #![feature(arbitrary_self_types, unsize, coerce_unsized, dispatch_from_dyn)] |
29967ef6 | 4 | |
6a06907d XL |
5 | use std::{ |
6 | ops::{Deref, CoerceUnsized, DispatchFromDyn}, | |
7 | marker::Unsize, | |
8 | }; | |
29967ef6 XL |
9 | |
10 | struct Ptr<T: ?Sized>(Box<T>); | |
11 | ||
12 | impl<T: ?Sized> Deref for Ptr<T> { | |
13 | type Target = T; | |
14 | ||
15 | fn deref(&self) -> &T { | |
16 | &*self.0 | |
17 | } | |
18 | } | |
19 | ||
20 | impl<T: Unsize<U> + ?Sized, U: ?Sized> CoerceUnsized<Ptr<U>> for Ptr<T> {} | |
21 | impl<T: Unsize<U> + ?Sized, U: ?Sized> DispatchFromDyn<Ptr<U>> for Ptr<T> {} | |
22 | ||
23 | struct Wrapper<T: ?Sized>(T); | |
24 | ||
25 | impl<T: ?Sized> Deref for Wrapper<T> { | |
26 | type Target = T; | |
27 | ||
28 | fn deref(&self) -> &T { | |
29 | &self.0 | |
30 | } | |
31 | } | |
32 | ||
33 | impl<T: CoerceUnsized<U>, U> CoerceUnsized<Wrapper<U>> for Wrapper<T> {} | |
34 | impl<T: DispatchFromDyn<U>, U> DispatchFromDyn<Wrapper<U>> for Wrapper<T> {} | |
35 | ||
36 | ||
37 | trait Trait { | |
38 | // This method isn't object-safe yet. Unsized by-value `self` is object-safe (but not callable | |
5e7ed085 | 39 | // without unsized_locals), but wrappers around `Self` currently are not. |
29967ef6 XL |
40 | // FIXME (mikeyhew) uncomment this when unsized rvalues object-safety is implemented |
41 | // fn wrapper(self: Wrapper<Self>) -> i32; | |
42 | fn ptr_wrapper(self: Ptr<Wrapper<Self>>) -> i32; | |
43 | fn wrapper_ptr(self: Wrapper<Ptr<Self>>) -> i32; | |
44 | fn wrapper_ptr_wrapper(self: Wrapper<Ptr<Wrapper<Self>>>) -> i32; | |
45 | } | |
46 | ||
47 | impl Trait for i32 { | |
48 | fn ptr_wrapper(self: Ptr<Wrapper<Self>>) -> i32 { | |
49 | **self | |
50 | } | |
51 | fn wrapper_ptr(self: Wrapper<Ptr<Self>>) -> i32 { | |
52 | **self | |
53 | } | |
54 | fn wrapper_ptr_wrapper(self: Wrapper<Ptr<Wrapper<Self>>>) -> i32 { | |
55 | ***self | |
56 | } | |
57 | } | |
58 | ||
6a06907d XL |
59 | fn main() { |
60 | let pw = Ptr(Box::new(Wrapper(5))) as Ptr<Wrapper<dyn Trait>>; | |
29967ef6 XL |
61 | assert_eq!(pw.ptr_wrapper(), 5); |
62 | ||
6a06907d | 63 | let wp = Wrapper(Ptr(Box::new(6))) as Wrapper<Ptr<dyn Trait>>; |
29967ef6 XL |
64 | assert_eq!(wp.wrapper_ptr(), 6); |
65 | ||
6a06907d | 66 | let wpw = Wrapper(Ptr(Box::new(Wrapper(7)))) as Wrapper<Ptr<Wrapper<dyn Trait>>>; |
29967ef6 | 67 | assert_eq!(wpw.wrapper_ptr_wrapper(), 7); |
29967ef6 | 68 | } |