diff --git a/src/librustc/middle/typeck/check/regionck.rs b/src/librustc/middle/typeck/check/regionck.rs index 4c36a935dee33..d8da67fff7fa3 100644 --- a/src/librustc/middle/typeck/check/regionck.rs +++ b/src/librustc/middle/typeck/check/regionck.rs @@ -299,7 +299,7 @@ pub fn regionck_expr(fcx: &FnCtxt, e: &ast::Expr) { // regionck assumes typeck succeeded rcx.visit_expr(e, ()); } - fcx.infcx().resolve_regions(); + fcx.infcx().resolve_regions_and_report_errors(); } pub fn regionck_fn(fcx: &FnCtxt, blk: &ast::Block) { @@ -309,7 +309,7 @@ pub fn regionck_fn(fcx: &FnCtxt, blk: &ast::Block) { // regionck assumes typeck succeeded rcx.visit_block(blk, ()); } - fcx.infcx().resolve_regions(); + fcx.infcx().resolve_regions_and_report_errors(); } impl<'a> Visitor<()> for Rcx<'a> { diff --git a/src/librustc/middle/typeck/check/vtable.rs b/src/librustc/middle/typeck/check/vtable.rs index 192c67eb8d1d9..955290e711f7a 100644 --- a/src/librustc/middle/typeck/check/vtable.rs +++ b/src/librustc/middle/typeck/check/vtable.rs @@ -734,7 +734,8 @@ pub fn early_resolve_expr(ex: &ast::Expr, fcx: &FnCtxt, is_early: bool) { pub fn resolve_impl(tcx: &ty::ctxt, impl_item: &ast::Item, impl_generics: &ty::Generics, - impl_trait_ref: &ty::TraitRef) { + impl_trait_ref: &ty::TraitRef) +{ let param_env = ty::construct_parameter_environment( tcx, None, @@ -775,6 +776,7 @@ pub fn resolve_impl(tcx: &ty::ctxt, lookup_vtables_for_param(&vcx, impl_item.span, None, ¶m_bounds, t, false); + infcx.resolve_regions_and_report_errors(); let res = impl_res { trait_vtables: vtbls, diff --git a/src/librustc/middle/typeck/infer/mod.rs b/src/librustc/middle/typeck/infer/mod.rs index 20bd47b3022a2..c10ab5205d9b9 100644 --- a/src/librustc/middle/typeck/infer/mod.rs +++ b/src/librustc/middle/typeck/infer/mod.rs @@ -644,7 +644,7 @@ impl<'a> InferCtxt<'a> { self.region_vars.new_bound(binder_id) } - pub fn resolve_regions(&self) { + pub fn resolve_regions_and_report_errors(&self) { let errors = self.region_vars.resolve_regions(); self.report_region_errors(&errors); // see error_reporting.rs } diff --git a/src/test/compile-fail/trait-impl-of-supertrait-has-wrong-lifetime-parameters.rs b/src/test/compile-fail/trait-impl-of-supertrait-has-wrong-lifetime-parameters.rs new file mode 100644 index 0000000000000..716362415a64a --- /dev/null +++ b/src/test/compile-fail/trait-impl-of-supertrait-has-wrong-lifetime-parameters.rs @@ -0,0 +1,41 @@ +// 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. + +// Check that when we test the supertrait we ensure consistent use of +// lifetime parameters. In this case, implementing T2<'a,'b> requires +// an impl of T1<'a>, but we have an impl of T1<'b>. + +trait T1<'x> { + fn x(&self) -> &'x int; +} + +trait T2<'x, 'y> : T1<'x> { + fn y(&self) -> &'y int; +} + +struct S<'a, 'b> { + a: &'a int, + b: &'b int +} + +impl<'a,'b> T1<'b> for S<'a, 'b> { + fn x(&self) -> &'b int { + self.b + } +} + +impl<'a,'b> T2<'a, 'b> for S<'a, 'b> { //~ ERROR cannot infer an appropriate lifetime + fn y(&self) -> &'b int { + self.b + } +} + +pub fn main() { +}