summaryrefslogtreecommitdiffstats
path: root/src/test/ui/typeck/issue-65611.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
commit698f8c2f01ea549d77d7dc3338a12e04c11057b9 (patch)
tree173a775858bd501c378080a10dca74132f05bc50 /src/test/ui/typeck/issue-65611.rs
parentInitial commit. (diff)
downloadrustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.tar.xz
rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.zip
Adding upstream version 1.64.0+dfsg1.upstream/1.64.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/test/ui/typeck/issue-65611.rs')
-rw-r--r--src/test/ui/typeck/issue-65611.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/test/ui/typeck/issue-65611.rs b/src/test/ui/typeck/issue-65611.rs
new file mode 100644
index 000000000..764531149
--- /dev/null
+++ b/src/test/ui/typeck/issue-65611.rs
@@ -0,0 +1,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();
+}