diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-07-12 16:27:22 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-07-12 16:54:46 -0700 |
| commit | 41a3888da7fbcff128f03c16a8cefe4d74ab5a58 (patch) | |
| tree | a82653c112f247e8bbab5ca974224afd677e51a7 /src/comp/middle | |
| parent | a38ba01fa41c31279321bf765d3384a533edf709 (diff) | |
| download | rust-41a3888da7fbcff128f03c16a8cefe4d74ab5a58.tar.gz rust-41a3888da7fbcff128f03c16a8cefe4d74ab5a58.zip | |
Fix type inference of fn tail expressions. Closes #680
Diffstat (limited to 'src/comp/middle')
| -rw-r--r-- | src/comp/middle/typeck.rs | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index b74e4950859..26351bfadec 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -2603,18 +2603,19 @@ fn check_fn(&@crate_ctxt ccx, &ast::fn_decl decl, ast::proto proto, case (_) { } } - auto success = writeback::resolve_type_vars_in_block(fcx, body); - - if (success && option::is_some(body.node.expr)) { + 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)) { + auto nil = ty::mk_nil(fcx.ccx.tcx); + if (!are_compatible(fcx, nil, tail_expr_ty)) { demand::simple(fcx, tail_expr.span, fcx.ret_ty, tail_expr_ty); } } + + writeback::resolve_type_vars_in_block(fcx, body); } fn check_method(&@crate_ctxt ccx, &@ast::method method) { |
