2 // Test structs with always-unsized fields.
5 #![feature(box_syntax, unsize, ptr_metadata)]
26 fn foo(&self) -> usize;
34 fn foo(&self) -> usize {
52 let _ = mem::size_of::<Box<Foo<u8>>>();
53 let _ = mem::size_of::<Box<Bar>>();
54 let _ = mem::size_of::<Box<Baz>>();
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));
63 assert_eq!(x.f.len(), 3);
64 assert_eq!(x.f[0], 1);
72 box Baz_ { 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));
75 let chs: Vec<char> = x.f2.chars().collect();
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');
87 let obj: Box<St> = box St { f: 42 };
89 let data: Box<_> = box Qux_ { f: St { f: 234 } };
90 let x: &Qux = &*ptr::from_raw_parts::<Qux>((&*data as *const _).cast(), ptr::metadata(obj));
91 assert_eq!(x.f.foo(), 234);