1 // Adapted from rustc run-pass test suite
3 #![feature(no_core, arbitrary_self_types, box_syntax)]
4 #![feature(rustc_attrs)]
6 #![feature(start, lang_items)]
9 extern crate mini_core;
13 macro_rules! assert_eq {
14 ($l:expr, $r: expr) => {
16 panic(stringify!($l != $r));
21 struct Ptr<T: ?Sized>(Box<T>);
23 impl<T: ?Sized> Deref for Ptr<T> {
26 fn deref(&self) -> &T {
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> {}
34 struct Wrapper<T: ?Sized>(T);
36 impl<T: ?Sized> Deref for Wrapper<T> {
39 fn deref(&self) -> &T {
44 impl<T: CoerceUnsized<U>, U> CoerceUnsized<Wrapper<U>> for Wrapper<T> {}
45 impl<T: DispatchFromDyn<U>, U> DispatchFromDyn<Wrapper<U>> for Wrapper<T> {}
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;
59 fn ptr_wrapper(self: Ptr<Wrapper<Self>>) -> i32 {
62 fn wrapper_ptr(self: Wrapper<Ptr<Self>>) -> i32 {
65 fn wrapper_ptr_wrapper(self: Wrapper<Ptr<Wrapper<Self>>>) -> i32 {
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);
75 let wp = Wrapper(Ptr(box 6)) as Wrapper<Ptr<dyn Trait>>;
76 assert_eq!(wp.wrapper_ptr(), 6);
78 let wpw = Wrapper(Ptr(box Wrapper(7))) as Wrapper<Ptr<Wrapper<dyn Trait>>>;
79 assert_eq!(wpw.wrapper_ptr_wrapper(), 7);