From: Jonas Schievink Date: Fri, 18 Mar 2016 10:34:51 +0000 (+0100) Subject: liveness: substitute bound regions with free ones before normalizing the return type X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=fcaefcfdb0489e86d9ba7ad6ab75b41ae33bc6c3;p=rust.git liveness: substitute bound regions with free ones before normalizing the return type Fixes #32323 --- diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs index 0bfb830efc1..73db978cffe 100644 --- a/src/librustc/middle/liveness.rs +++ b/src/librustc/middle/liveness.rs @@ -115,6 +115,7 @@ use middle::ty::{self, TyCtxt, ParameterEnvironment}; use middle::traits::{self, ProjectionMode}; use middle::infer; +use middle::subst::Subst; use lint; use util::nodemap::NodeMap; @@ -1495,6 +1496,7 @@ fn check_ret(&self, if self.live_on_entry(entry_ln, self.s.no_ret_var).is_some() => { let param_env = ParameterEnvironment::for_item(&self.ir.tcx, id); + let t_ret_subst = t_ret.subst(&self.ir.tcx, ¶m_env.free_substs); let infcx = infer::new_infer_ctxt(&self.ir.tcx, &self.ir.tcx.tables, Some(param_env), @@ -1502,7 +1504,7 @@ fn check_ret(&self, let cause = traits::ObligationCause::dummy(); let norm = traits::fully_normalize(&infcx, cause, - &t_ret); + &t_ret_subst); if norm.unwrap().is_nil() { // for nil return types, it is ok to not return a value expl. diff --git a/src/test/compile-fail/issue-32323.rs b/src/test/compile-fail/issue-32323.rs new file mode 100644 index 00000000000..e3461e52e1c --- /dev/null +++ b/src/test/compile-fail/issue-32323.rs @@ -0,0 +1,18 @@ +// Copyright 2016 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. + +pub trait Tr<'a> { + type Out; +} + +pub fn f<'a, T: Tr<'a>>() -> >::Out {} +//~^ ERROR not all control paths return a value + +pub fn main() {}