1 // run-pass
2 #![allow(dead_code)]
3 // Test that pointers and references to extern types are thin, ie they have the same size and
4 // alignment as a pointer to ().
5 #![feature(extern_types)]
6 
7 use std::mem::{align_of, size_of};
8 
9 extern "C" {
10     type A;
11 }
12 
13 struct Foo {
14     x: u8,
15     tail: A,
16 }
17 
18 struct Bar<T: ?Sized> {
19     x: u8,
20     tail: T,
21 }
22 
assert_thin<T: ?Sized>()23 fn assert_thin<T: ?Sized>() {
24     assert_eq!(size_of::<*const T>(), size_of::<*const ()>());
25     assert_eq!(align_of::<*const T>(), align_of::<*const ()>());
26 
27     assert_eq!(size_of::<*mut T>(), size_of::<*mut ()>());
28     assert_eq!(align_of::<*mut T>(), align_of::<*mut ()>());
29 
30     assert_eq!(size_of::<&T>(), size_of::<&()>());
31     assert_eq!(align_of::<&T>(), align_of::<&()>());
32 
33     assert_eq!(size_of::<&mut T>(), size_of::<&mut ()>());
34     assert_eq!(align_of::<&mut T>(), align_of::<&mut ()>());
35 }
36 
main()37 fn main() {
38     assert_thin::<A>();
39     assert_thin::<Foo>();
40     assert_thin::<Bar<A>>();
41     assert_thin::<Bar<Bar<A>>>();
42 }
43