From 7c02517f758a20e8d5893c8b2024fbf87f7a0447 Mon Sep 17 00:00:00 2001 From: Michael Sullivan Date: Wed, 31 Aug 2011 16:15:02 -0400 Subject: [PATCH] Check all paths return properly in blocks. Closes #874. --- src/comp/middle/tstate/ck.rs | 2 +- src/test/compile-fail/block-require-return.rs | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 src/test/compile-fail/block-require-return.rs diff --git a/src/comp/middle/tstate/ck.rs b/src/comp/middle/tstate/ck.rs index 5f899b81f880..8817a16cdd43 100644 --- a/src/comp/middle/tstate/ck.rs +++ b/src/comp/middle/tstate/ck.rs @@ -145,7 +145,7 @@ fn check_states_against_conditions(fcx: &fn_ctxt, f: &_fn, /* Check that the return value is initialized */ let post = aux::block_poststate(fcx.ccx, f.body); - if f.proto == ast::proto_fn && + if f.proto != ast::proto_iter && !promises(fcx, post, fcx.enclosing.i_return) && !type_is_nil(fcx.ccx.tcx, ret_ty_of_fn(fcx.ccx.tcx, id)) && f.decl.cf == return { diff --git a/src/test/compile-fail/block-require-return.rs b/src/test/compile-fail/block-require-return.rs new file mode 100644 index 000000000000..6a64bd44daaf --- /dev/null +++ b/src/test/compile-fail/block-require-return.rs @@ -0,0 +1,5 @@ +// error-pattern: not all control paths return +fn force(f: &block() -> int) -> int { f() } +fn main() { + log_err force({| | }); +}