summaryrefslogtreecommitdiffstats
path: root/tests/ui/intrinsics/intrinsic-volatile.rs
blob: 7b2c825a2084b400ca062abf6b33d622b322fbb9 (plain)
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
// run-pass

#![feature(core_intrinsics)]

use std::intrinsics::*;

pub fn main() {
    unsafe {
        let mut x: Box<u8> = Box::new(0);
        let mut y: Box<u8> = Box::new(0);

        // test volatile load
        assert_eq!(volatile_load(&*x), 0);
        *x = 1;
        assert_eq!(volatile_load(&*x), 1);

        // test volatile store
        volatile_store(&mut *x, 2);
        assert_eq!(*x, 2);

        // test volatile copy memory
        volatile_copy_memory(&mut *y, &*x, 1);
        assert_eq!(*y, 2);

        // test volatile copy non-overlapping memory
        *x = 3;
        volatile_copy_nonoverlapping_memory(&mut *y, &*x, 1);
        assert_eq!(*y, 3);

        // test volatile set memory
        volatile_set_memory(&mut *x, 4, 1);
        assert_eq!(*x, 4);

        // test unaligned volatile load
        let arr: [u8; 3] = [1, 2, 3];
        let ptr = arr[1..].as_ptr() as *const u16;
        assert_eq!(unaligned_volatile_load(ptr), u16::from_ne_bytes([arr[1], arr[2]]));

        // test unaligned volatile store
        let ptr = arr[1..].as_ptr() as *mut u16;
        unaligned_volatile_store(ptr, 0);
        assert_eq!(arr, [1, 0, 0]);
    }
}