]> git.lizzy.rs Git - rust.git/blob - tests/ui/self/arbitrary_self_types_pointers_and_wrappers.rs
Rollup merge of #107091 - clubby789:infer-ftl-missing-dollar, r=compiler-errors
[rust.git] / tests / ui / self / arbitrary_self_types_pointers_and_wrappers.rs
1 // run-pass
2 #![feature(arbitrary_self_types, unsize, coerce_unsized, dispatch_from_dyn)]
3 #![feature(rustc_attrs)]
4
5 use std::{
6     ops::{Deref, CoerceUnsized, DispatchFromDyn},
7     marker::Unsize,
8 };
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
39     // without unsized_locals), but wrappers arond `Self` currently are not.
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
59 fn main() {
60     let pw = Ptr(Box::new(Wrapper(5))) as Ptr<Wrapper<dyn Trait>>;
61     assert_eq!(pw.ptr_wrapper(), 5);
62
63     let wp = Wrapper(Ptr(Box::new(6))) as Wrapper<Ptr<dyn Trait>>;
64     assert_eq!(wp.wrapper_ptr(), 6);
65
66     let wpw = Wrapper(Ptr(Box::new(Wrapper(7)))) as Wrapper<Ptr<Wrapper<dyn Trait>>>;
67     assert_eq!(wpw.wrapper_ptr_wrapper(), 7);
68 }