diff options
| author | Jonas Schievink <jonas@schievink.net> | 2016-03-13 12:11:16 +0100 |
|---|---|---|
| committer | Jonas Schievink <jonas@schievink.net> | 2016-03-16 12:19:58 +0100 |
| commit | f0b0a4ff2a4102e9429320a7f4d76d7c834f5bf5 (patch) | |
| tree | 6035d19e133cdf10a24eeb3155a34550a08781b7 | |
| parent | 3317cc9d758faf9b875122217b0d765619dbcd07 (diff) | |
| download | rust-f0b0a4ff2a4102e9429320a7f4d76d7c834f5bf5.tar.gz rust-f0b0a4ff2a4102e9429320a7f4d76d7c834f5bf5.zip | |
Normalize return type when checking for E0269
Fixes #31597
| -rw-r--r-- | src/librustc/middle/liveness.rs | 14 | ||||
| -rw-r--r-- | src/test/run-pass/issue-31597.rs | 23 |
2 files changed, 35 insertions, 2 deletions
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 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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() {} |
