3 #[cfg(panic = "unwind")]
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);
15 #[cfg(target_pointer_width = "16")]
17 assert_eq!(size_of::<usize>(), 2);
18 assert_eq!(size_of::<*const usize>(), 2);
22 #[cfg(target_pointer_width = "32")]
24 assert_eq!(size_of::<usize>(), 4);
25 assert_eq!(size_of::<*const usize>(), 4);
29 #[cfg(target_pointer_width = "64")]
31 assert_eq!(size_of::<usize>(), 8);
32 assert_eq!(size_of::<*const usize>(), 8);
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);
45 assert_eq!(align_of::<u8>(), 1);
46 assert_eq!(align_of::<u16>(), 2);
47 assert_eq!(align_of::<u32>(), 4);
51 #[cfg(target_pointer_width = "16")]
53 assert_eq!(align_of::<usize>(), 2);
54 assert_eq!(align_of::<*const usize>(), 2);
58 #[cfg(target_pointer_width = "32")]
60 assert_eq!(align_of::<usize>(), 4);
61 assert_eq!(align_of::<*const usize>(), 4);
65 #[cfg(target_pointer_width = "64")]
67 assert_eq!(align_of::<usize>(), 8);
68 assert_eq!(align_of::<*const usize>(), 8);
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);
89 let mut x = Some("test".to_string());
90 let y = replace(&mut x, None);
96 fn test_transmute_copy() {
97 assert_eq!(1, unsafe { transmute_copy(&1) });
100 // Remove this test when `std::raw` is removed.
101 // The replacement pointer metadata APIs are tested in library/core/tests/ptr.rs
104 fn test_transmute() {
108 impl Foo for isize {}
110 let a = box 100isize as Box<dyn Foo>;
112 let x: ::core::raw::TraitObject = transmute(a);
113 assert!(*(x.data as *const isize) == 100);
114 let _x: Box<dyn Foo> = transmute(x);
118 assert_eq!(transmute::<_, Vec<u8>>("L".to_string()), [76]);
124 fn test_discriminant_send_sync() {
133 fn is_send_sync<T: Send + Sync>() {}
135 is_send_sync::<Discriminant<Regular>>();
136 is_send_sync::<Discriminant<NotSendSync>>();
140 fn assume_init_good() {
141 const TRUE: bool = unsafe { MaybeUninit::<bool>::new(true).assume_init() };
147 fn uninit_array_assume_init() {
148 let mut array: [MaybeUninit<i16>; 5] = MaybeUninit::uninit_array();
155 let array = unsafe { MaybeUninit::array_assume_init(array) };
157 assert_eq!(array, [3, 1, 4, 1, 5]);
159 let [] = unsafe { MaybeUninit::<!>::array_assume_init([]) };
163 fn uninit_write_slice() {
164 let mut dst = [MaybeUninit::new(255); 64];
167 assert_eq!(MaybeUninit::write_slice(&mut dst, &src), &src);
171 #[should_panic(expected = "source slice length (32) does not match destination slice length (64)")]
172 fn uninit_write_slice_panic_lt() {
173 let mut dst = [MaybeUninit::uninit(); 64];
176 MaybeUninit::write_slice(&mut dst, &src);
180 #[should_panic(expected = "source slice length (128) does not match destination slice length (64)")]
181 fn uninit_write_slice_panic_gt() {
182 let mut dst = [MaybeUninit::uninit(); 64];
185 MaybeUninit::write_slice(&mut dst, &src);
189 fn uninit_clone_from_slice() {
190 let mut dst = [MaybeUninit::new(255); 64];
193 assert_eq!(MaybeUninit::write_slice_cloned(&mut dst, &src), &src);
197 #[should_panic(expected = "destination and source slices have different lengths")]
198 fn uninit_write_slice_cloned_panic_lt() {
199 let mut dst = [MaybeUninit::uninit(); 64];
202 MaybeUninit::write_slice_cloned(&mut dst, &src);
206 #[should_panic(expected = "destination and source slices have different lengths")]
207 fn uninit_write_slice_cloned_panic_gt() {
208 let mut dst = [MaybeUninit::uninit(); 64];
211 MaybeUninit::write_slice_cloned(&mut dst, &src);
215 #[cfg(panic = "unwind")]
216 fn uninit_write_slice_cloned_mid_panic() {
219 enum IncrementOrPanic {
225 impl Clone for IncrementOrPanic {
226 fn clone(&self) -> Self {
228 Self::Increment(rc) => Self::Increment(rc.clone()),
229 Self::ExpectedPanic => panic!("expected panic on clone"),
230 Self::UnexpectedPanic => panic!("unexpected panic on clone"),
235 let rc = Rc::new(());
238 MaybeUninit::uninit(),
239 MaybeUninit::uninit(),
240 MaybeUninit::uninit(),
241 MaybeUninit::uninit(),
245 IncrementOrPanic::Increment(rc.clone()),
246 IncrementOrPanic::Increment(rc.clone()),
247 IncrementOrPanic::ExpectedPanic,
248 IncrementOrPanic::UnexpectedPanic,
251 let err = panic::catch_unwind(panic::AssertUnwindSafe(|| {
252 MaybeUninit::write_slice_cloned(&mut dst, &src);
258 Ok(_) => unreachable!(),
261 .downcast::<&'static str>()
262 .and_then(|s| if *s == "expected panic on clone" { Ok(s) } else { Err(s) })
263 .unwrap_or_else(|p| panic::resume_unwind(p));
265 assert_eq!(Rc::strong_count(&rc), 1)
271 fn uninit_write_slice_cloned_no_drop() {
277 panic!("dropped a bomb! kaboom")
281 let mut dst = [MaybeUninit::uninit()];
284 MaybeUninit::write_slice_cloned(&mut dst, &src);
290 fn uninit_const_assume_init_read() {
291 const FOO: u32 = unsafe { MaybeUninit::new(42).assume_init_read() };