| //@ run-pass | |
| #![feature(core_intrinsics)] | |
| use std::intrinsics::{ volatile_copy_memory, volatile_store, volatile_load, | |
| volatile_copy_nonoverlapping_memory, | |
| volatile_set_memory }; | |
| // | |
| // This test ensures that volatile intrinsics can be specialised with | |
| // zero-sized types and, in case of copy/set functions, can accept | |
| // number of elements equal to zero. | |
| // | |
| fn main () { | |
| let mut dst_pair = (1, 2); | |
| let src_pair = (3, 4); | |
| let mut dst_empty = (); | |
| let src_empty = (); | |
| const COUNT_0: usize = 0; | |
| const COUNT_100: usize = 100; | |
| unsafe { | |
| volatile_copy_memory(&mut dst_pair, &dst_pair, COUNT_0); | |
| volatile_copy_nonoverlapping_memory(&mut dst_pair, &src_pair, 0); | |
| volatile_copy_memory(&mut dst_empty, &dst_empty, 100); | |
| volatile_copy_nonoverlapping_memory(&mut dst_empty, &src_empty, | |
| COUNT_100); | |
| volatile_set_memory(&mut dst_empty, 0, COUNT_100); | |
| volatile_set_memory(&mut dst_pair, 0, COUNT_0); | |
| volatile_store(&mut dst_empty, ()); | |
| volatile_store(&mut dst_empty, src_empty); | |
| volatile_load(&src_empty); | |
| } | |
| } |