2 #![feature(box_syntax)]
4 struct Fat<T: ?Sized> {
10 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
13 #[derive(Copy, Clone, PartialEq, Eq)]
19 fn to_bar(&self) -> Bar;
20 fn to_val(&self) -> isize;
24 fn to_bar(&self) -> Bar {
27 fn to_val(&self) -> isize {
32 fn to_bar(&self) -> Bar {
35 fn to_val(&self) -> isize {
41 fn foo(x: &Fat<dyn ToBar>) {
43 assert_eq!(x.f2, "some str");
44 assert_eq!(x.ptr.to_bar(), Bar);
45 assert_eq!(x.ptr.to_val(), 42);
48 assert_eq!(y.to_bar(), Bar);
49 assert_eq!(y.to_val(), 42);
52 fn bar(x: &dyn ToBar) {
53 assert_eq!(x.to_bar(), Bar);
54 assert_eq!(x.to_val(), 42);
57 fn baz(x: &Fat<Fat<dyn ToBar>>) {
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);
66 assert_eq!(y.to_bar(), Bar);
67 assert_eq!(y.to_val(), 42);
72 let f1 = Fat { f1: 5, f2: "some str", ptr: Bar1 {f :42} };
76 let f3: &Fat<dyn ToBar> = f2;
78 let f4: &Fat<dyn ToBar> = &f1;
80 let f5: &Fat<dyn ToBar> = &Fat { f1: 5, f2: "some str", ptr: Bar1 {f :42} };
84 let f6: &Fat<dyn ToBar> = &Fat { f1: 5, f2: "some str", ptr: Bar };
85 assert_eq!(f6.ptr.to_bar(), Bar);
89 let f7: Box<dyn ToBar> = Box::new(Bar1 {f :42});
94 Fat { f1: 5, f2: "some str", ptr: Fat { f1: 8, f2: "deep str", ptr: Bar1 {f :42}} };
98 let f3: &Fat<Fat<dyn ToBar>> = f2;
100 let f4: &Fat<Fat<dyn ToBar>> = &f1;
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}} };