#![allow(non_camel_case_types)]
// Verifies that labels are propagated through loads and stores.
//
//@ needs-sanitizer-support
//@ needs-sanitizer-dataflow
//@ run-pass
//@ compile-flags: -Zsanitizer=dataflow -Zsanitizer-dataflow-abilist={{src-base}}/sanitizer/dataflow-abilist.txt

use std::mem::size_of;
use std::os::raw::{c_int, c_long, c_void};

type dfsan_label = u8;

extern "C" {
    fn dfsan_add_label(label: dfsan_label, addr: *mut c_void, size: usize);
    fn dfsan_get_label(data: c_long) -> dfsan_label;
    fn dfsan_has_label(label: dfsan_label, elem: dfsan_label) -> c_int;
    fn dfsan_read_label(addr: *const c_void, size: usize) -> dfsan_label;
    fn dfsan_set_label(label: dfsan_label, addr: *mut c_void, size: usize);
}

fn propagate2(i: &i64) -> i64 {
    i.clone()
}

fn propagate(i: i64) -> i64 {
    let v = vec!(i, 1, 2, 3);
    let j = v.iter().sum();
    propagate2(&j)
}

pub fn main() {
    let mut i = 1i64;
    let i_ptr = &mut i as *mut i64;
    let i_label: dfsan_label = 1;
    unsafe {
        dfsan_set_label(i_label, i_ptr as *mut c_void, size_of::<i64>());
    }

    let new_label = unsafe { dfsan_get_label(i) };
    assert_eq!(i_label, new_label);

    let read_label = unsafe { dfsan_read_label(i_ptr as *const c_void, size_of::<i64>()) };
    assert_eq!(i_label, read_label);

    let j_label: dfsan_label = 2;
    unsafe {
        dfsan_add_label(j_label, i_ptr as *mut c_void, size_of::<i64>());
    }

    let read_label = unsafe { dfsan_read_label(i_ptr as *const c_void, size_of::<i64>()) };
    assert_eq!(unsafe { dfsan_has_label(read_label, i_label) }, 1);
    assert_eq!(unsafe { dfsan_has_label(read_label, j_label) }, 1);

    let mut new_i = propagate(i);
    let new_i_ptr = &mut new_i as *mut i64;
    let read_label = unsafe { dfsan_read_label(new_i_ptr as *const c_void, size_of::<i64>()) };
    assert_eq!(unsafe { dfsan_has_label(read_label, i_label) }, 1);
    assert_eq!(unsafe { dfsan_has_label(read_label, j_label) }, 1);
}
