about summary refs log tree commit diff
path: root/tests/ui/precondition-checks/copy-nonoverlapping.rs
blob: eacaa63e543af9473223113bfb20a8990a7e66f7 (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
//@ run-fail
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
//@ error-pattern: unsafe precondition(s) violated: ptr::copy_nonoverlapping requires
//@ revisions: null_src null_dst misaligned_src misaligned_dst overlapping

#![allow(invalid_null_arguments)]

use std::ptr;

fn main() {
    let src = [0u16; 3];
    let mut dst = [0u16; 3];
    let src = src.as_ptr();
    let dst = dst.as_mut_ptr();
    unsafe {
        #[cfg(null_src)]
        ptr::copy_nonoverlapping(ptr::null(), dst, 1);
        #[cfg(null_dst)]
        ptr::copy_nonoverlapping(src, ptr::null_mut(), 1);
        #[cfg(misaligned_src)]
        ptr::copy_nonoverlapping(src.byte_add(1), dst, 1);
        #[cfg(misaligned_dst)]
        ptr::copy_nonoverlapping(src, dst.byte_add(1), 1);
        #[cfg(overlapping)]
        ptr::copy_nonoverlapping(dst, dst.add(1), 2);
    }
}