2 // Test structs with always-unsized fields.
5 #![feature(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
::new(Foo_ { f: [1, 2, 3] }
);
62 let x
: &Foo
<i32> = mem
::transmute(ptr
::slice_from_raw_parts(&*data
, 3));
63 assert_eq
!(x
.f
.len(), 3);
64 assert_eq
!(x
.f
[0], 1);
72 Box
::new(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(ptr
::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
::new(St { f: 42 }
);
89 let data
: Box
<_
> = Box
::new(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);