summaryrefslogtreecommitdiffstats
path: root/src/test/ui/typeck/issue-65611.rs
blob: 7645311496d8ccb138724bd9a7d1cdfbad6d4313 (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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
use std::mem::MaybeUninit;
use std::ops::Deref;

pub unsafe trait Array {
    /// The array’s element type
    type Item;
    #[doc(hidden)]
    /// The smallest index type that indexes the array.
    type Index: Index;
    #[doc(hidden)]
    fn as_ptr(&self) -> *const Self::Item;
    #[doc(hidden)]
    fn as_mut_ptr(&mut self) -> *mut Self::Item;
    #[doc(hidden)]
    fn capacity() -> usize;
}

pub trait Index : PartialEq + Copy {
    fn to_usize(self) -> usize;
    fn from(i: usize) -> Self;
}

impl Index for usize {
    fn to_usize(self) -> usize { self }
    fn from(val: usize) -> Self {
        val
    }
}

unsafe impl<T> Array for [T; 1] {
    type Item = T;
    type Index = usize;
    fn as_ptr(&self) -> *const T { self as *const _ as *const _ }
    fn as_mut_ptr(&mut self) -> *mut T { self as *mut _ as *mut _}
    fn capacity() -> usize { 1 }
}

impl<A: Array> Deref for ArrayVec<A> {
    type Target = [A::Item];
    #[inline]
    fn deref(&self) -> &[A::Item] {
        panic!()
    }
}

pub struct ArrayVec<A: Array> {
    xs: MaybeUninit<A>,
    len: usize,
}

impl<A: Array> ArrayVec<A> {
    pub fn new() -> ArrayVec<A> {
        panic!()
    }
}

fn main() {
    let mut buffer = ArrayVec::new();
    let x = buffer.last().unwrap().0.clone();
    //~^ ERROR type annotations needed
    //~| ERROR no field `0` on type `&_`
    buffer.reverse();
}