| //@ 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); |
| } |
| } |