]> git.lizzy.rs Git - rust.git/blob - src/test/ui/dynamically-sized-types/dst-trait.rs
Rollup merge of #98640 - cuviper:stable-rust-analyzer, r=Mark-Simulacrum
[rust.git] / src / test / ui / dynamically-sized-types / dst-trait.rs
1 // run-pass
2 #![feature(box_syntax)]
3
4 struct Fat<T: ?Sized> {
5     f1: isize,
6     f2: &'static str,
7     ptr: T
8 }
9
10 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
11 struct Bar;
12
13 #[derive(Copy, Clone, PartialEq, Eq)]
14 struct Bar1 {
15     f: isize
16 }
17
18 trait ToBar {
19     fn to_bar(&self) -> Bar;
20     fn to_val(&self) -> isize;
21 }
22
23 impl ToBar for Bar {
24     fn to_bar(&self) -> Bar {
25         *self
26     }
27     fn to_val(&self) -> isize {
28         0
29     }
30 }
31 impl ToBar for Bar1 {
32     fn to_bar(&self) -> Bar {
33         Bar
34     }
35     fn to_val(&self) -> isize {
36         self.f
37     }
38 }
39
40 // x is a fat pointer
41 fn foo(x: &Fat<dyn ToBar>) {
42     assert_eq!(x.f1, 5);
43     assert_eq!(x.f2, "some str");
44     assert_eq!(x.ptr.to_bar(), Bar);
45     assert_eq!(x.ptr.to_val(), 42);
46
47     let y = &x.ptr;
48     assert_eq!(y.to_bar(), Bar);
49     assert_eq!(y.to_val(), 42);
50 }
51
52 fn bar(x: &dyn ToBar) {
53     assert_eq!(x.to_bar(), Bar);
54     assert_eq!(x.to_val(), 42);
55 }
56
57 fn baz(x: &Fat<Fat<dyn ToBar>>) {
58     assert_eq!(x.f1, 5);
59     assert_eq!(x.f2, "some str");
60     assert_eq!(x.ptr.f1, 8);
61     assert_eq!(x.ptr.f2, "deep str");
62     assert_eq!(x.ptr.ptr.to_bar(), Bar);
63     assert_eq!(x.ptr.ptr.to_val(), 42);
64
65     let y = &x.ptr.ptr;
66     assert_eq!(y.to_bar(), Bar);
67     assert_eq!(y.to_val(), 42);
68
69 }
70
71 pub fn main() {
72     let f1 = Fat { f1: 5, f2: "some str", ptr: Bar1 {f :42} };
73     foo(&f1);
74     let f2 = &f1;
75     foo(f2);
76     let f3: &Fat<dyn ToBar> = f2;
77     foo(f3);
78     let f4: &Fat<dyn ToBar> = &f1;
79     foo(f4);
80     let f5: &Fat<dyn ToBar> = &Fat { f1: 5, f2: "some str", ptr: Bar1 {f :42} };
81     foo(f5);
82
83     // Zero size object.
84     let f6: &Fat<dyn ToBar> = &Fat { f1: 5, f2: "some str", ptr: Bar };
85     assert_eq!(f6.ptr.to_bar(), Bar);
86
87     // &*
88     //
89     let f7: Box<dyn ToBar> = Box::new(Bar1 {f :42});
90     bar(&*f7);
91
92     // Deep nesting
93     let f1 =
94         Fat { f1: 5, f2: "some str", ptr: Fat { f1: 8, f2: "deep str", ptr: Bar1 {f :42}} };
95     baz(&f1);
96     let f2 = &f1;
97     baz(f2);
98     let f3: &Fat<Fat<dyn ToBar>> = f2;
99     baz(f3);
100     let f4: &Fat<Fat<dyn ToBar>> = &f1;
101     baz(f4);
102     let f5: &Fat<Fat<dyn ToBar>> =
103         &Fat { f1: 5, f2: "some str", ptr: Fat { f1: 8, f2: "deep str", ptr: Bar1 {f :42}} };
104     baz(f5);
105 }