]> git.lizzy.rs Git - rust.git/blob - example/arbitrary_self_types_pointers_and_wrappers.rs
Merge pull request #1100 from mominul/trans->codegen
[rust.git] / example / arbitrary_self_types_pointers_and_wrappers.rs
1 // Adapted from rustc run-pass test suite
2
3 #![feature(no_core, arbitrary_self_types, box_syntax)]
4 #![feature(rustc_attrs)]
5
6 #![feature(start, lang_items)]
7 #![no_core]
8
9 extern crate mini_core;
10
11 use mini_core::*;
12
13 macro_rules! assert_eq {
14     ($l:expr, $r: expr) => {
15         if $l != $r {
16             panic(stringify!($l != $r));
17         }
18     }
19 }
20
21 struct Ptr<T: ?Sized>(Box<T>);
22
23 impl<T: ?Sized> Deref for Ptr<T> {
24     type Target = T;
25
26     fn deref(&self) -> &T {
27         &*self.0
28     }
29 }
30
31 impl<T: Unsize<U> + ?Sized, U: ?Sized> CoerceUnsized<Ptr<U>> for Ptr<T> {}
32 impl<T: Unsize<U> + ?Sized, U: ?Sized> DispatchFromDyn<Ptr<U>> for Ptr<T> {}
33
34 struct Wrapper<T: ?Sized>(T);
35
36 impl<T: ?Sized> Deref for Wrapper<T> {
37     type Target = T;
38
39     fn deref(&self) -> &T {
40         &self.0
41     }
42 }
43
44 impl<T: CoerceUnsized<U>, U> CoerceUnsized<Wrapper<U>> for Wrapper<T> {}
45 impl<T: DispatchFromDyn<U>, U> DispatchFromDyn<Wrapper<U>> for Wrapper<T> {}
46
47
48 trait Trait {
49     // This method isn't object-safe yet. Unsized by-value `self` is object-safe (but not callable
50     // without unsized_locals), but wrappers arond `Self` currently are not.
51     // FIXME (mikeyhew) uncomment this when unsized rvalues object-safety is implemented
52     // fn wrapper(self: Wrapper<Self>) -> i32;
53     fn ptr_wrapper(self: Ptr<Wrapper<Self>>) -> i32;
54     fn wrapper_ptr(self: Wrapper<Ptr<Self>>) -> i32;
55     fn wrapper_ptr_wrapper(self: Wrapper<Ptr<Wrapper<Self>>>) -> i32;
56 }
57
58 impl Trait for i32 {
59     fn ptr_wrapper(self: Ptr<Wrapper<Self>>) -> i32 {
60         **self
61     }
62     fn wrapper_ptr(self: Wrapper<Ptr<Self>>) -> i32 {
63         **self
64     }
65     fn wrapper_ptr_wrapper(self: Wrapper<Ptr<Wrapper<Self>>>) -> i32 {
66         ***self
67     }
68 }
69
70 #[start]
71 fn main(_: isize, _: *const *const u8) -> isize {
72     let pw = Ptr(box Wrapper(5)) as Ptr<Wrapper<dyn Trait>>;
73     assert_eq!(pw.ptr_wrapper(), 5);
74
75     let wp = Wrapper(Ptr(box 6)) as Wrapper<Ptr<dyn Trait>>;
76     assert_eq!(wp.wrapper_ptr(), 6);
77
78     let wpw = Wrapper(Ptr(box Wrapper(7))) as Wrapper<Ptr<Wrapper<dyn Trait>>>;
79     assert_eq!(wpw.wrapper_ptr_wrapper(), 7);
80
81     0
82 }