From d9f306757d3e7cdffaea26ddacaea55a837c3124 Mon Sep 17 00:00:00 2001 From: Barosl Lee Date: Sat, 13 Dec 2014 23:22:04 +0900 Subject: [PATCH] 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. --- src/librustc_typeck/check/method/probe.rs | 13 ++++++++----- src/test/compile-fail/issue-19692.rs | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 src/test/compile-fail/issue-19692.rs diff --git a/src/librustc_typeck/check/method/probe.rs b/src/librustc_typeck/check/method/probe.rs index b5776f9aeb34a..1217f811bc434 100644 --- a/src/librustc_typeck/check/method/probe.rs +++ b/src/librustc_typeck/check/method/probe.rs @@ -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 // think cause spurious errors. Really though this part should // 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. 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>, span: Span, self_ty: Ty<'tcx>) - -> Vec> { + -> Option>> { let mut steps = Vec::new(); let (fully_dereferenced_ty, dereferences, _) = @@ -179,11 +182,11 @@ fn create_steps<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>, adjustment: AutoUnsizeLength(dereferences, len), }); } - _ => { - } + ty::ty_err => return None, + _ => (), } - return steps; + Some(steps) } impl<'a,'tcx> ProbeContext<'a,'tcx> { diff --git a/src/test/compile-fail/issue-19692.rs b/src/test/compile-fail/issue-19692.rs new file mode 100644 index 0000000000000..4069ea6b997c4 --- /dev/null +++ b/src/test/compile-fail/issue-19692.rs @@ -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 or the MIT license +// , 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() { }