From 4c166abbbb4e11f9464f97a468fcd34dbc3d2fb5 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Fri, 3 Oct 2014 22:35:16 -0700 Subject: [PATCH 1/2] Handle provided trait methods when giving inference error suggestions This fixes an ICE. Closes issue #17758 --- src/librustc/middle/typeck/infer/error_reporting.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/librustc/middle/typeck/infer/error_reporting.rs b/src/librustc/middle/typeck/infer/error_reporting.rs index 8ff5b3c902493..2a8a695b63ed1 100644 --- a/src/librustc/middle/typeck/infer/error_reporting.rs +++ b/src/librustc/middle/typeck/infer/error_reporting.rs @@ -869,6 +869,19 @@ impl<'a, 'tcx> ErrorReporting for InferCtxt<'a, 'tcx> { ast::TypeImplItem(_) => None, } }, + ast_map::NodeTraitItem(ref item) => { + match **item { + ast::ProvidedMethod(ref m) => { + Some((m.pe_fn_decl(), + m.pe_generics(), + m.pe_fn_style(), + m.pe_ident(), + Some(&m.pe_explicit_self().node), + m.span)) + } + _ => None + } + } _ => None }, None => None From 6f6d13a7c7cb2faa12c0905b094024521a86c165 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Fri, 3 Oct 2014 22:37:08 -0700 Subject: [PATCH 2/2] Add regression test for issue #17758 --- src/test/compile-fail/issue-17758.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/test/compile-fail/issue-17758.rs diff --git a/src/test/compile-fail/issue-17758.rs b/src/test/compile-fail/issue-17758.rs new file mode 100644 index 0000000000000..bb480e5e4dd82 --- /dev/null +++ b/src/test/compile-fail/issue-17758.rs @@ -0,0 +1,22 @@ +// 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. + +// Test that regionck suggestions in a provided method of a trait +// don't ICE + +trait Foo<'a> { + fn foo(&'a self); + fn bar(&self) { + self.foo(); + //~^ ERROR mismatched types: expected `&'a Self`, found `&Self` (lifetime mismatch) + } +} + +fn main() {}