]> git.lizzy.rs Git - rust.git/blob - src/test/ui/dynamically-sized-types/dst-struct.rs
Rollup merge of #90498 - joshtriplett:target-tier-policy-draft-updates, r=Mark-Simulacrum
[rust.git] / src / test / ui / dynamically-sized-types / dst-struct.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 // x is a fat pointer
11 fn foo(x: &Fat<[isize]>) {
12     let y = &x.ptr;
13     assert_eq!(x.ptr.len(), 3);
14     assert_eq!(y[0], 1);
15     assert_eq!(x.ptr[1], 2);
16     assert_eq!(x.f1, 5);
17     assert_eq!(x.f2, "some str");
18 }
19
20 fn foo2<T:ToBar>(x: &Fat<[T]>) {
21     let y = &x.ptr;
22     let bar = Bar;
23     assert_eq!(x.ptr.len(), 3);
24     assert_eq!(y[0].to_bar(), bar);
25     assert_eq!(x.ptr[1].to_bar(), bar);
26     assert_eq!(x.f1, 5);
27     assert_eq!(x.f2, "some str");
28 }
29
30 fn foo3(x: &Fat<Fat<[isize]>>) {
31     let y = &x.ptr.ptr;
32     assert_eq!(x.f1, 5);
33     assert_eq!(x.f2, "some str");
34     assert_eq!(x.ptr.f1, 8);
35     assert_eq!(x.ptr.f2, "deep str");
36     assert_eq!(x.ptr.ptr.len(), 3);
37     assert_eq!(y[0], 1);
38     assert_eq!(x.ptr.ptr[1], 2);
39 }
40
41
42 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
43 struct Bar;
44
45 trait ToBar {
46     fn to_bar(&self) -> Bar;
47 }
48
49 impl ToBar for Bar {
50     fn to_bar(&self) -> Bar {
51         *self
52     }
53 }
54
55 pub fn main() {
56     // With a vec of ints.
57     let f1 = Fat { f1: 5, f2: "some str", ptr: [1, 2, 3] };
58     foo(&f1);
59     let f2 = &f1;
60     foo(f2);
61     let f3: &Fat<[isize]> = f2;
62     foo(f3);
63     let f4: &Fat<[isize]> = &f1;
64     foo(f4);
65     let f5: &Fat<[isize]> = &Fat { f1: 5, f2: "some str", ptr: [1, 2, 3] };
66     foo(f5);
67
68     // With a vec of Bars.
69     let bar = Bar;
70     let f1 = Fat { f1: 5, f2: "some str", ptr: [bar, bar, bar] };
71     foo2(&f1);
72     let f2 = &f1;
73     foo2(f2);
74     let f3: &Fat<[Bar]> = f2;
75     foo2(f3);
76     let f4: &Fat<[Bar]> = &f1;
77     foo2(f4);
78     let f5: &Fat<[Bar]> = &Fat { f1: 5, f2: "some str", ptr: [bar, bar, bar] };
79     foo2(f5);
80
81     // Assignment.
82     let f5: &mut Fat<[isize]> = &mut Fat { f1: 5, f2: "some str", ptr: [1, 2, 3] };
83     f5.ptr[1] = 34;
84     assert_eq!(f5.ptr[0], 1);
85     assert_eq!(f5.ptr[1], 34);
86     assert_eq!(f5.ptr[2], 3);
87
88     // Zero size vec.
89     let f5: &Fat<[isize]> = &Fat { f1: 5, f2: "some str", ptr: [] };
90     assert!(f5.ptr.is_empty());
91     let f5: &Fat<[Bar]> = &Fat { f1: 5, f2: "some str", ptr: [] };
92     assert!(f5.ptr.is_empty());
93
94     // Deeply nested.
95     let f1 = Fat { f1: 5, f2: "some str", ptr: Fat { f1: 8, f2: "deep str", ptr: [1, 2, 3]} };
96     foo3(&f1);
97     let f2 = &f1;
98     foo3(f2);
99     let f3: &Fat<Fat<[isize]>> = f2;
100     foo3(f3);
101     let f4: &Fat<Fat<[isize]>> = &f1;
102     foo3(f4);
103     let f5: &Fat<Fat<[isize]>> =
104         &Fat { f1: 5, f2: "some str", ptr: Fat { f1: 8, f2: "deep str", ptr: [1, 2, 3]} };
105     foo3(f5);
106
107     // Box.
108     let f1 = Box::new([1, 2, 3]);
109     assert_eq!((*f1)[1], 2);
110     let f2: Box<[isize]> = f1;
111     assert_eq!((*f2)[1], 2);
112
113     // Nested Box.
114     let f1 : Box<Fat<[isize; 3]>> = box Fat { f1: 5, f2: "some str", ptr: [1, 2, 3] };
115     foo(&*f1);
116     let f2 : Box<Fat<[isize]>> = f1;
117     foo(&*f2);
118
119     let f3 : Box<Fat<[isize]>> =
120         Box::<Fat<[_; 3]>>::new(Fat { f1: 5, f2: "some str", ptr: [1, 2, 3] });
121     foo(&*f3);
122 }