forked from rust-lang/rust-bindgen
/
typedef-pointer-overlap.rs
153 lines (152 loc) · 3.47 KB
/
typedef-pointer-overlap.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#![allow(
dead_code,
non_snake_case,
non_camel_case_types,
non_upper_case_globals
)]
#[repr(C)]
#[derive(Debug, Default, Copy, Clone)]
pub struct foo {
pub inner: ::std::os::raw::c_char,
}
#[test]
fn bindgen_test_layout_foo() {
const UNINIT: ::std::mem::MaybeUninit<foo> =
::std::mem::MaybeUninit::uninit();
let ptr = UNINIT.as_ptr();
assert_eq!(
::std::mem::size_of::<foo>(),
1usize,
concat!("Size of: ", stringify!(foo))
);
assert_eq!(
::std::mem::align_of::<foo>(),
1usize,
concat!("Alignment of ", stringify!(foo))
);
assert_eq!(
unsafe { ::std::ptr::addr_of!((*ptr).inner) as usize - ptr as usize },
0usize,
concat!(
"Offset of field: ",
stringify!(foo),
"::",
stringify!(inner)
)
);
}
pub type foo_ptr = *const foo;
#[repr(C)]
#[derive(Debug, Default, Copy, Clone)]
pub struct bar {
pub inner: ::std::os::raw::c_char,
}
#[test]
fn bindgen_test_layout_bar() {
const UNINIT: ::std::mem::MaybeUninit<bar> =
::std::mem::MaybeUninit::uninit();
let ptr = UNINIT.as_ptr();
assert_eq!(
::std::mem::size_of::<bar>(),
1usize,
concat!("Size of: ", stringify!(bar))
);
assert_eq!(
::std::mem::align_of::<bar>(),
1usize,
concat!("Alignment of ", stringify!(bar))
);
assert_eq!(
unsafe { ::std::ptr::addr_of!((*ptr).inner) as usize - ptr as usize },
0usize,
concat!(
"Offset of field: ",
stringify!(bar),
"::",
stringify!(inner)
)
);
}
pub type bar_ptr = *mut bar;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct baz {
_unused: [u8; 0],
}
pub type baz_ptr = *mut baz;
#[repr(C)]
#[derive(Copy, Clone)]
pub union cat {
pub standard_issue: ::std::os::raw::c_int,
}
#[test]
fn bindgen_test_layout_cat() {
const UNINIT: ::std::mem::MaybeUninit<cat> =
::std::mem::MaybeUninit::uninit();
let ptr = UNINIT.as_ptr();
assert_eq!(
::std::mem::size_of::<cat>(),
4usize,
concat!("Size of: ", stringify!(cat))
);
assert_eq!(
::std::mem::align_of::<cat>(),
4usize,
concat!("Alignment of ", stringify!(cat))
);
assert_eq!(
unsafe {
::std::ptr::addr_of!((*ptr).standard_issue) as usize - ptr as usize
},
0usize,
concat!(
"Offset of field: ",
stringify!(cat),
"::",
stringify!(standard_issue)
)
);
}
impl Default for cat {
fn default() -> Self {
let mut s = ::std::mem::MaybeUninit::<Self>::uninit();
unsafe {
::std::ptr::write_bytes(s.as_mut_ptr(), 0, 1);
s.assume_init()
}
}
}
pub type cat_ptr = *mut cat;
pub const mad_scientist: mad = 0;
pub type mad = ::std::os::raw::c_uint;
pub type mad_ptr = *mut mad;
extern "C" {
pub fn takes_foo_ptr(arg1: foo_ptr);
}
extern "C" {
pub fn takes_foo_struct(arg1: foo);
}
extern "C" {
pub fn takes_bar_ptr(arg1: bar_ptr);
}
extern "C" {
pub fn takes_bar_struct(arg1: bar);
}
extern "C" {
pub fn takes_baz_ptr(arg1: baz_ptr);
}
extern "C" {
pub fn takes_baz_struct(arg1: baz);
}
extern "C" {
pub fn takes_cat_ptr(arg1: cat_ptr);
}
extern "C" {
pub fn takes_cat_union(arg1: cat);
}
extern "C" {
pub fn takes_mad_ptr(arg1: mad_ptr);
}
extern "C" {
pub fn takes_mad_enum(arg1: mad);
}