]> git.proxmox.com Git - rustc.git/blob - library/core/tests/mem.rs
New upstream version 1.52.0~beta.3+dfsg1
[rustc.git] / library / core / tests / mem.rs
1 use core::mem::*;
2
3 #[cfg(panic = "unwind")]
4 use std::rc::Rc;
5
6 #[test]
7 fn size_of_basic() {
8 assert_eq!(size_of::<u8>(), 1);
9 assert_eq!(size_of::<u16>(), 2);
10 assert_eq!(size_of::<u32>(), 4);
11 assert_eq!(size_of::<u64>(), 8);
12 }
13
14 #[test]
15 #[cfg(target_pointer_width = "16")]
16 fn size_of_16() {
17 assert_eq!(size_of::<usize>(), 2);
18 assert_eq!(size_of::<*const usize>(), 2);
19 }
20
21 #[test]
22 #[cfg(target_pointer_width = "32")]
23 fn size_of_32() {
24 assert_eq!(size_of::<usize>(), 4);
25 assert_eq!(size_of::<*const usize>(), 4);
26 }
27
28 #[test]
29 #[cfg(target_pointer_width = "64")]
30 fn size_of_64() {
31 assert_eq!(size_of::<usize>(), 8);
32 assert_eq!(size_of::<*const usize>(), 8);
33 }
34
35 #[test]
36 fn size_of_val_basic() {
37 assert_eq!(size_of_val(&1u8), 1);
38 assert_eq!(size_of_val(&1u16), 2);
39 assert_eq!(size_of_val(&1u32), 4);
40 assert_eq!(size_of_val(&1u64), 8);
41 }
42
43 #[test]
44 fn align_of_basic() {
45 assert_eq!(align_of::<u8>(), 1);
46 assert_eq!(align_of::<u16>(), 2);
47 assert_eq!(align_of::<u32>(), 4);
48 }
49
50 #[test]
51 #[cfg(target_pointer_width = "16")]
52 fn align_of_16() {
53 assert_eq!(align_of::<usize>(), 2);
54 assert_eq!(align_of::<*const usize>(), 2);
55 }
56
57 #[test]
58 #[cfg(target_pointer_width = "32")]
59 fn align_of_32() {
60 assert_eq!(align_of::<usize>(), 4);
61 assert_eq!(align_of::<*const usize>(), 4);
62 }
63
64 #[test]
65 #[cfg(target_pointer_width = "64")]
66 fn align_of_64() {
67 assert_eq!(align_of::<usize>(), 8);
68 assert_eq!(align_of::<*const usize>(), 8);
69 }
70
71 #[test]
72 fn align_of_val_basic() {
73 assert_eq!(align_of_val(&1u8), 1);
74 assert_eq!(align_of_val(&1u16), 2);
75 assert_eq!(align_of_val(&1u32), 4);
76 }
77
78 #[test]
79 fn test_swap() {
80 let mut x = 31337;
81 let mut y = 42;
82 swap(&mut x, &mut y);
83 assert_eq!(x, 42);
84 assert_eq!(y, 31337);
85 }
86
87 #[test]
88 fn test_replace() {
89 let mut x = Some("test".to_string());
90 let y = replace(&mut x, None);
91 assert!(x.is_none());
92 assert!(y.is_some());
93 }
94
95 #[test]
96 fn test_transmute_copy() {
97 assert_eq!(1, unsafe { transmute_copy(&1) });
98 }
99
100 #[test]
101 fn test_transmute() {
102 trait Foo {
103 fn dummy(&self) {}
104 }
105 impl Foo for isize {}
106
107 let a = box 100isize as Box<dyn Foo>;
108 unsafe {
109 let x: ::core::raw::TraitObject = transmute(a);
110 assert!(*(x.data as *const isize) == 100);
111 let _x: Box<dyn Foo> = transmute(x);
112 }
113
114 unsafe {
115 assert_eq!(transmute::<_, Vec<u8>>("L".to_string()), [76]);
116 }
117 }
118
119 #[test]
120 #[allow(dead_code)]
121 fn test_discriminant_send_sync() {
122 enum Regular {
123 A,
124 B(i32),
125 }
126 enum NotSendSync {
127 A(*const i32),
128 }
129
130 fn is_send_sync<T: Send + Sync>() {}
131
132 is_send_sync::<Discriminant<Regular>>();
133 is_send_sync::<Discriminant<NotSendSync>>();
134 }
135
136 #[test]
137 fn assume_init_good() {
138 const TRUE: bool = unsafe { MaybeUninit::<bool>::new(true).assume_init() };
139
140 assert!(TRUE);
141 }
142
143 #[test]
144 fn uninit_array_assume_init() {
145 let mut array: [MaybeUninit<i16>; 5] = MaybeUninit::uninit_array();
146 array[0].write(3);
147 array[1].write(1);
148 array[2].write(4);
149 array[3].write(1);
150 array[4].write(5);
151
152 let array = unsafe { MaybeUninit::array_assume_init(array) };
153
154 assert_eq!(array, [3, 1, 4, 1, 5]);
155
156 let [] = unsafe { MaybeUninit::<!>::array_assume_init([]) };
157 }
158
159 #[test]
160 fn uninit_write_slice() {
161 let mut dst = [MaybeUninit::new(255); 64];
162 let src = [0; 64];
163
164 assert_eq!(MaybeUninit::write_slice(&mut dst, &src), &src);
165 }
166
167 #[test]
168 #[should_panic(expected = "source slice length (32) does not match destination slice length (64)")]
169 fn uninit_write_slice_panic_lt() {
170 let mut dst = [MaybeUninit::uninit(); 64];
171 let src = [0; 32];
172
173 MaybeUninit::write_slice(&mut dst, &src);
174 }
175
176 #[test]
177 #[should_panic(expected = "source slice length (128) does not match destination slice length (64)")]
178 fn uninit_write_slice_panic_gt() {
179 let mut dst = [MaybeUninit::uninit(); 64];
180 let src = [0; 128];
181
182 MaybeUninit::write_slice(&mut dst, &src);
183 }
184
185 #[test]
186 fn uninit_clone_from_slice() {
187 let mut dst = [MaybeUninit::new(255); 64];
188 let src = [0; 64];
189
190 assert_eq!(MaybeUninit::write_slice_cloned(&mut dst, &src), &src);
191 }
192
193 #[test]
194 #[should_panic(expected = "destination and source slices have different lengths")]
195 fn uninit_write_slice_cloned_panic_lt() {
196 let mut dst = [MaybeUninit::uninit(); 64];
197 let src = [0; 32];
198
199 MaybeUninit::write_slice_cloned(&mut dst, &src);
200 }
201
202 #[test]
203 #[should_panic(expected = "destination and source slices have different lengths")]
204 fn uninit_write_slice_cloned_panic_gt() {
205 let mut dst = [MaybeUninit::uninit(); 64];
206 let src = [0; 128];
207
208 MaybeUninit::write_slice_cloned(&mut dst, &src);
209 }
210
211 #[test]
212 #[cfg(panic = "unwind")]
213 fn uninit_write_slice_cloned_mid_panic() {
214 use std::panic;
215
216 enum IncrementOrPanic {
217 Increment(Rc<()>),
218 ExpectedPanic,
219 UnexpectedPanic,
220 }
221
222 impl Clone for IncrementOrPanic {
223 fn clone(&self) -> Self {
224 match self {
225 Self::Increment(rc) => Self::Increment(rc.clone()),
226 Self::ExpectedPanic => panic!("expected panic on clone"),
227 Self::UnexpectedPanic => panic!("unexpected panic on clone"),
228 }
229 }
230 }
231
232 let rc = Rc::new(());
233
234 let mut dst = [
235 MaybeUninit::uninit(),
236 MaybeUninit::uninit(),
237 MaybeUninit::uninit(),
238 MaybeUninit::uninit(),
239 ];
240
241 let src = [
242 IncrementOrPanic::Increment(rc.clone()),
243 IncrementOrPanic::Increment(rc.clone()),
244 IncrementOrPanic::ExpectedPanic,
245 IncrementOrPanic::UnexpectedPanic,
246 ];
247
248 let err = panic::catch_unwind(panic::AssertUnwindSafe(|| {
249 MaybeUninit::write_slice_cloned(&mut dst, &src);
250 }));
251
252 drop(src);
253
254 match err {
255 Ok(_) => unreachable!(),
256 Err(payload) => {
257 payload
258 .downcast::<&'static str>()
259 .and_then(|s| if *s == "expected panic on clone" { Ok(s) } else { Err(s) })
260 .unwrap_or_else(|p| panic::resume_unwind(p));
261
262 assert_eq!(Rc::strong_count(&rc), 1)
263 }
264 }
265 }
266
267 #[test]
268 fn uninit_write_slice_cloned_no_drop() {
269 #[derive(Clone)]
270 struct Bomb;
271
272 impl Drop for Bomb {
273 fn drop(&mut self) {
274 panic!("dropped a bomb! kaboom")
275 }
276 }
277
278 let mut dst = [MaybeUninit::uninit()];
279 let src = [Bomb];
280
281 MaybeUninit::write_slice_cloned(&mut dst, &src);
282
283 forget(src);
284 }
285
286 #[test]
287 fn uninit_const_assume_init_read() {
288 const FOO: u32 = unsafe { MaybeUninit::new(42).assume_init_read() };
289 assert_eq!(FOO, 42);
290 }