Rollup merge of #65755 - estebank:icicle, r=davidtwco

Avoid ICE when adjusting bad self ty

Fix #65611.
This commit is contained in:
Mazdak Farrokhzad 2019-10-24 20:20:08 +02:00 committed by GitHub
commit 7b3896fdf2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 96 additions and 5 deletions

View File

@ -141,14 +141,24 @@ fn confirm(
///////////////////////////////////////////////////////////////////////////
// ADJUSTMENTS
fn adjust_self_ty(&mut self,
unadjusted_self_ty: Ty<'tcx>,
pick: &probe::Pick<'tcx>)
-> Ty<'tcx> {
fn adjust_self_ty(
&mut self,
unadjusted_self_ty: Ty<'tcx>,
pick: &probe::Pick<'tcx>,
) -> Ty<'tcx> {
// Commit the autoderefs by calling `autoderef` again, but this
// time writing the results into the various tables.
let mut autoderef = self.autoderef(self.span, unadjusted_self_ty);
let (_, n) = autoderef.nth(pick.autoderefs).unwrap();
let (_, n) = match autoderef.nth(pick.autoderefs) {
Some(n) => n,
None => {
self.tcx.sess.delay_span_bug(
syntax_pos::DUMMY_SP,
&format!("failed autoderef {}", pick.autoderefs),
);
return self.tcx.types.err;
}
};
assert_eq!(n, pick.autoderefs);
let mut adjustments = autoderef.adjust_steps(self, Needs::None);

View File

@ -0,0 +1,63 @@
use std::mem::MaybeUninit;
use std::ops::Deref;
pub unsafe trait Array {
/// The arrays 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(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();
}

View File

@ -0,0 +1,18 @@
error[E0282]: type annotations needed
--> $DIR/issue-65611.rs:59:20
|
LL | let x = buffer.last().unwrap().0.clone();
| ^^^^ cannot infer type for `T`
|
= note: type must be known at this point
error[E0609]: no field `0` on type `&_`
--> $DIR/issue-65611.rs:59:36
|
LL | let x = buffer.last().unwrap().0.clone();
| ^
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0282, E0609.
For more information about an error, try `rustc --explain E0282`.