]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | // Test structs with always-unsized fields. |
2 | ||
c34b1796 | 3 | |
62682a34 SL |
4 | #![allow(warnings)] |
5 | #![feature(box_syntax, unsize, raw)] | |
1a4d82fc JJ |
6 | |
7 | use std::mem; | |
8 | use std::raw; | |
c34b1796 | 9 | use std::slice; |
1a4d82fc JJ |
10 | |
11 | struct Foo<T> { | |
12 | f: [T], | |
13 | } | |
14 | ||
15 | struct Bar { | |
c34b1796 AL |
16 | f1: usize, |
17 | f2: [usize], | |
1a4d82fc JJ |
18 | } |
19 | ||
20 | struct Baz { | |
c34b1796 | 21 | f1: usize, |
1a4d82fc JJ |
22 | f2: str, |
23 | } | |
24 | ||
25 | trait Tr { | |
c34b1796 | 26 | fn foo(&self) -> usize; |
1a4d82fc JJ |
27 | } |
28 | ||
29 | struct St { | |
c34b1796 | 30 | f: usize |
1a4d82fc JJ |
31 | } |
32 | ||
33 | impl Tr for St { | |
c34b1796 | 34 | fn foo(&self) -> usize { |
1a4d82fc JJ |
35 | self.f |
36 | } | |
37 | } | |
38 | ||
39 | struct Qux<'a> { | |
40 | f: Tr+'a | |
41 | } | |
42 | ||
43 | pub fn main() { | |
44 | let _: &Foo<f64>; | |
45 | let _: &Bar; | |
46 | let _: &Baz; | |
47 | ||
48 | let _: Box<Foo<i32>>; | |
49 | let _: Box<Bar>; | |
50 | let _: Box<Baz>; | |
51 | ||
52 | let _ = mem::size_of::<Box<Foo<u8>>>(); | |
53 | let _ = mem::size_of::<Box<Bar>>(); | |
54 | let _ = mem::size_of::<Box<Baz>>(); | |
55 | ||
56 | unsafe { | |
57 | struct Foo_<T> { | |
58 | f: [T; 3] | |
59 | } | |
60 | ||
c34b1796 AL |
61 | let data: Box<Foo_<i32>> = box Foo_{f: [1, 2, 3] }; |
62 | let x: &Foo<i32> = mem::transmute(slice::from_raw_parts(&*data, 3)); | |
62682a34 SL |
63 | assert_eq!(x.f.len(), 3); |
64 | assert_eq!(x.f[0], 1); | |
1a4d82fc JJ |
65 | |
66 | struct Baz_ { | |
c34b1796 | 67 | f1: usize, |
1a4d82fc JJ |
68 | f2: [u8; 5], |
69 | } | |
70 | ||
c34b1796 AL |
71 | let data: Box<_> = box Baz_ { |
72 | f1: 42, f2: ['a' as u8, 'b' as u8, 'c' as u8, 'd' as u8, 'e' as u8] }; | |
73 | let x: &Baz = mem::transmute(slice::from_raw_parts(&*data, 5)); | |
62682a34 | 74 | assert_eq!(x.f1, 42); |
1a4d82fc | 75 | let chs: Vec<char> = x.f2.chars().collect(); |
62682a34 SL |
76 | assert_eq!(chs.len(), 5); |
77 | assert_eq!(chs[0], 'a'); | |
78 | assert_eq!(chs[1], 'b'); | |
79 | assert_eq!(chs[2], 'c'); | |
80 | assert_eq!(chs[3], 'd'); | |
81 | assert_eq!(chs[4], 'e'); | |
1a4d82fc JJ |
82 | |
83 | struct Qux_ { | |
84 | f: St | |
85 | } | |
86 | ||
87 | let obj: Box<St> = box St { f: 42 }; | |
88 | let obj: &Tr = &*obj; | |
89 | let obj: raw::TraitObject = mem::transmute(&*obj); | |
c34b1796 | 90 | let data: Box<_> = box Qux_{ f: St { f: 234 } }; |
1a4d82fc JJ |
91 | let x: &Qux = mem::transmute(raw::TraitObject { vtable: obj.vtable, |
92 | data: mem::transmute(&*data) }); | |
62682a34 | 93 | assert_eq!(x.f.foo(), 234); |
1a4d82fc JJ |
94 | } |
95 | } |