//! Ensure we error when trying to load from a pointer whose provenance has been messed with.
//@ ignore-parallel-frontend different alloc ids
const PARTIAL_OVERWRITE: () = {
    let mut p = &42;
    // Overwrite one byte with a no-provenance value.
    unsafe {
        let ptr: *mut _ = &mut p;
        *(ptr as *mut u8) = 123;
    }
    let x = *p; //~ ERROR: unable to read parts of a pointer
};

const PTR_BYTES_SWAP: () = {
    let mut p = &42;
    // Swap the first two bytes.
    unsafe {
        let ptr = &mut p as *mut _ as *mut std::mem::MaybeUninit<u8>;
        let byte0 = ptr.read();
        let byte1 = ptr.add(1).read();
        ptr.write(byte1);
        ptr.add(1).write(byte0);
    }
    let x = *p; //~ ERROR: unable to read parts of a pointer
};

const PTR_BYTES_REPEAT: () = {
    let mut p = &42;
    // Duplicate the first byte over the second.
    unsafe {
        let ptr = &mut p as *mut _ as *mut std::mem::MaybeUninit<u8>;
        let byte0 = ptr.read();
        ptr.add(1).write(byte0);
    }
    let x = *p; //~ ERROR: unable to read parts of a pointer
};

const PTR_BYTES_MIX: () = {
    let mut p = &42;
    let q = &43;
    // Overwrite the first byte of p with the first byte of q.
    unsafe {
        let ptr = &mut p as *mut _ as *mut std::mem::MaybeUninit<u8>;
        let qtr = &q as *const _ as *const std::mem::MaybeUninit<u8>;
        ptr.write(qtr.read());
    }
    let x = *p; //~ ERROR: unable to read parts of a pointer
};

fn main() {}
