]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_codegen_cranelift/example/arbitrary_self_types_pointers_and_wrappers.rs
New upstream version 1.61.0+dfsg1
[rustc.git] / compiler / rustc_codegen_cranelift / example / arbitrary_self_types_pointers_and_wrappers.rs
CommitLineData
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
5use std::{
6 ops::{Deref, CoerceUnsized, DispatchFromDyn},
7 marker::Unsize,
8};
29967ef6
XL
9
10struct Ptr<T: ?Sized>(Box<T>);
11
12impl<T: ?Sized> Deref for Ptr<T> {
13 type Target = T;
14
15 fn deref(&self) -> &T {
16 &*self.0
17 }
18}
19
20impl<T: Unsize<U> + ?Sized, U: ?Sized> CoerceUnsized<Ptr<U>> for Ptr<T> {}
21impl<T: Unsize<U> + ?Sized, U: ?Sized> DispatchFromDyn<Ptr<U>> for Ptr<T> {}
22
23struct Wrapper<T: ?Sized>(T);
24
25impl<T: ?Sized> Deref for Wrapper<T> {
26 type Target = T;
27
28 fn deref(&self) -> &T {
29 &self.0
30 }
31}
32
33impl<T: CoerceUnsized<U>, U> CoerceUnsized<Wrapper<U>> for Wrapper<T> {}
34impl<T: DispatchFromDyn<U>, U> DispatchFromDyn<Wrapper<U>> for Wrapper<T> {}
35
36
37trait 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
47impl 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
59fn 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}