Detect type inference failure when auto-dereferencing a pointer
check::autoderef() returns a ty_err when it fails to infer the type. probe::probe() should respect this failure and fail together to prevent further corruption. Call stack: check::check_method_call() -> method::lookup() -> probe::probe() + confirm::confirm() Fixes #19692. Fixes #19583. Fixes #19297.
This commit is contained in:
parent
95c2ed31ae
commit
d9f306757d
2 changed files with 26 additions and 5 deletions
|
@ -124,7 +124,10 @@ pub fn probe<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
|
||||||
// it ride, although it's really not great, and in fact could I
|
// it ride, although it's really not great, and in fact could I
|
||||||
// think cause spurious errors. Really though this part should
|
// think cause spurious errors. Really though this part should
|
||||||
// take place in the `fcx.infcx().probe` below.
|
// take place in the `fcx.infcx().probe` below.
|
||||||
let steps = create_steps(fcx, span, self_ty);
|
let steps = match create_steps(fcx, span, self_ty) {
|
||||||
|
Some(steps) => steps,
|
||||||
|
None => return Err(NoMatch(Vec::new())),
|
||||||
|
};
|
||||||
|
|
||||||
// Create a list of simplified self types, if we can.
|
// Create a list of simplified self types, if we can.
|
||||||
let mut simplified_steps = Vec::new();
|
let mut simplified_steps = Vec::new();
|
||||||
|
@ -160,7 +163,7 @@ pub fn probe<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
|
||||||
fn create_steps<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
|
fn create_steps<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
|
||||||
span: Span,
|
span: Span,
|
||||||
self_ty: Ty<'tcx>)
|
self_ty: Ty<'tcx>)
|
||||||
-> Vec<CandidateStep<'tcx>> {
|
-> Option<Vec<CandidateStep<'tcx>>> {
|
||||||
let mut steps = Vec::new();
|
let mut steps = Vec::new();
|
||||||
|
|
||||||
let (fully_dereferenced_ty, dereferences, _) =
|
let (fully_dereferenced_ty, dereferences, _) =
|
||||||
|
@ -179,11 +182,11 @@ fn create_steps<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
|
||||||
adjustment: AutoUnsizeLength(dereferences, len),
|
adjustment: AutoUnsizeLength(dereferences, len),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
_ => {
|
ty::ty_err => return None,
|
||||||
}
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
return steps;
|
Some(steps)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a,'tcx> ProbeContext<'a,'tcx> {
|
impl<'a,'tcx> ProbeContext<'a,'tcx> {
|
||||||
|
|
18
src/test/compile-fail/issue-19692.rs
Normal file
18
src/test/compile-fail/issue-19692.rs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
struct Homura;
|
||||||
|
|
||||||
|
fn akemi(homura: Homura) {
|
||||||
|
let Some(ref madoka) = Some(homura.kaname()); //~ ERROR does not implement any method
|
||||||
|
madoka.clone(); //~ ERROR the type of this value must be known
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() { }
|
Loading…
Add table
Add a link
Reference in a new issue