// run-pass
// Test DST raw pointers


#![feature(unsized_tuple_coercion)]

trait Trait {
    fn foo(&self) -> isize;
}

struct A {
    f: isize
}
impl Trait for A {
    fn foo(&self) -> isize {
        self.f
    }
}

struct Foo<T: ?Sized> {
    f: T
}

pub fn main() {
    // raw trait object
    let x = A { f: 42 };
    let z: *const dyn Trait = &x;
    let r = unsafe {
        (&*z).foo()
    };
    assert_eq!(r, 42);

    // raw DST struct
    let p = Foo {f: A { f: 42 }};
    let o: *const Foo<dyn Trait> = &p;
    let r = unsafe {
        (&*o).f.foo()
    };
    assert_eq!(r, 42);

    // raw DST tuple
    let p = (A { f: 42 },);
    let o: *const (dyn Trait,) = &p;
    let r = unsafe {
        (&*o).0.foo()
    };
    assert_eq!(r, 42);

    // raw slice
    let a: *const [_] = &[1, 2, 3];
    unsafe {
        let b = (*a)[2];
        assert_eq!(b, 3);
        let len = (*a).len();
        assert_eq!(len, 3);
    }

    // raw slice with explicit cast
    let a = &[1, 2, 3] as *const [i32];
    unsafe {
        let b = (*a)[2];
        assert_eq!(b, 3);
        let len = (*a).len();
        assert_eq!(len, 3);
    }

    // raw DST struct with slice
    let c: *const Foo<[_]> = &Foo {f: [1, 2, 3]};
    unsafe {
        let b = (&*c).f[0];
        assert_eq!(b, 1);
        let len = (&*c).f.len();
        assert_eq!(len, 3);
    }

    // raw DST tuple with slice
    let c: *const ([_],) = &([1, 2, 3],);
    unsafe {
        let b = (&*c).0[0];
        assert_eq!(b, 1);
        let len = (&*c).0.len();
        assert_eq!(len, 3);
    }

    // all of the above with *mut
    let mut x = A { f: 42 };
    let z: *mut dyn Trait = &mut x;
    let r = unsafe {
        (&*z).foo()
    };
    assert_eq!(r, 42);

    let mut p = Foo {f: A { f: 42 }};
    let o: *mut Foo<dyn Trait> = &mut p;
    let r = unsafe {
        (&*o).f.foo()
    };
    assert_eq!(r, 42);

    let mut p = (A { f: 42 },);
    let o: *mut (dyn Trait,) = &mut p;
    let r = unsafe {
        (&*o).0.foo()
    };
    assert_eq!(r, 42);

    let a: *mut [_] = &mut [1, 2, 3];
    unsafe {
        let b = (*a)[2];
        assert_eq!(b, 3);
        let len = (*a).len();
        assert_eq!(len, 3);
    }

    let a = &mut [1, 2, 3] as *mut [i32];
    unsafe {
        let b = (*a)[2];
        assert_eq!(b, 3);
        let len = (*a).len();
        assert_eq!(len, 3);
    }

    let c: *mut Foo<[_]> = &mut Foo {f: [1, 2, 3]};
    unsafe {
        let b = (&*c).f[0];
        assert_eq!(b, 1);
        let len = (&*c).f.len();
        assert_eq!(len, 3);
    }

    let c: *mut ([_],) = &mut ([1, 2, 3],);
    unsafe {
        let b = (&*c).0[0];
        assert_eq!(b, 1);
        let len = (&*c).0.len();
        assert_eq!(len, 3);
    }
}
