diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-06-18 19:04:31 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-06-18 20:23:05 -0700 |
| commit | 3852f1eee3cb2b608ed2fcb98cb078ffc102905e (patch) | |
| tree | a3734b4ee84652d0ef6be62002766ec5a4e8ace1 /src/comp | |
| parent | 2752284f4b13e4a7ecc8731a0dfc8a977c34acdb (diff) | |
| download | rust-3852f1eee3cb2b608ed2fcb98cb078ffc102905e.tar.gz rust-3852f1eee3cb2b608ed2fcb98cb078ffc102905e.zip | |
Typecheck block tail expressions that are fn return values
Diffstat (limited to 'src/comp')
| -rw-r--r-- | src/comp/middle/typeck.rs | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index fe4e049a07e..b96c7ccdb7d 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -2331,7 +2331,6 @@ fn check_fn(&@crate_ctxt ccx, &ast::fn_decl decl, ast::proto proto, mutable next_var_id=gather_result.next_var_id, mutable fixups=fixups, ccx=ccx); - // TODO: Make sure the type of the block agrees with the function type. check_block(fcx, body); alt (decl.purity) { @@ -2346,7 +2345,19 @@ fn check_fn(&@crate_ctxt ccx, &ast::fn_decl decl, ast::proto proto, } case (_) { } } + writeback::resolve_type_vars_in_block(fcx, body); + + if (option::is_some(body.node.expr)) { + auto tail_expr = option::get(body.node.expr); + auto tail_expr_ty = expr_ty(ccx.tcx, tail_expr); + // Have to exclude ty_nil to allow functions to end in + // while expressions, etc. + if (!ty::type_is_nil(ccx.tcx, tail_expr_ty)) { + demand::simple(fcx, tail_expr.span, + fcx.ret_ty, tail_expr_ty); + } + } } fn check_method(&@crate_ctxt ccx, &@ast::method method) { |
