diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs index 04240bf2875..a24b4952987 100644 --- a/src/librustc/middle/liveness.rs +++ b/src/librustc/middle/liveness.rs @@ -113,6 +113,8 @@ use dep_graph::DepNode; use middle::def::*; use middle::pat_util; use middle::ty::{self, TyCtxt}; +use middle::traits; +use middle::infer; use lint; use util::nodemap::NodeMap; @@ -1490,9 +1492,17 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { match fn_ret { ty::FnConverging(t_ret) - if self.live_on_entry(entry_ln, self.s.no_ret_var).is_some() => { + if self.live_on_entry(entry_ln, self.s.no_ret_var).is_some() => { - if t_ret.is_nil() { + let infcx = infer::new_infer_ctxt(&self.ir.tcx, &self.ir.tcx.tables, None); + let mut selcx = traits::SelectionContext::new(&infcx); + let cause = traits::ObligationCause::dummy(); + + let norm = traits::normalize(&mut selcx, + cause, + &t_ret); + + if norm.value.is_nil() { // for nil return types, it is ok to not return a value expl. } else { let ends_with_stmt = match body.expr { diff --git a/src/test/run-pass/issue-31597.rs b/src/test/run-pass/issue-31597.rs new file mode 100644 index 00000000000..132d476f9dc --- /dev/null +++ b/src/test/run-pass/issue-31597.rs @@ -0,0 +1,23 @@ +// 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. + +trait Make { + type Out; + + fn make() -> Self::Out; +} + +impl Make for () { + type Out = (); + + fn make() -> Self::Out {} +} + +fn main() {}