diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2011-12-20 16:18:18 -0800 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2011-12-21 06:14:35 -0800 |
| commit | 01cb1044f74b69e128bd73651971ef365954a0ba (patch) | |
| tree | f93199362abf618b617025d7f1daa835f324b129 | |
| parent | 6a901409410fc2fbc6722eb7b352008135252cec (diff) | |
| download | rust-01cb1044f74b69e128bd73651971ef365954a0ba.tar.gz rust-01cb1044f74b69e128bd73651971ef365954a0ba.zip | |
update pprinter to understand ret type of block, add warnings
| -rw-r--r-- | src/comp/middle/typeck.rs | 18 | ||||
| -rw-r--r-- | src/comp/syntax/print/pprust.rs | 5 |
2 files changed, 19 insertions, 4 deletions
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index d852e893800..f48de76f9d3 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -1512,6 +1512,10 @@ fn check_expr_fn_with_unifier(fcx: @fn_ctxt, let fty = ty_of_fn_decl(tcx, m_check_tyvar(fcx), decl, proto, [], none).ty; + log #fmt("check_expr_fn_with_unifier %s fty=%s", + expr_to_str(expr), + ty_to_str(tcx, fty)); + write::ty_only_fixup(fcx, expr.id, fty); // Unify the type of the function with the expected type before we @@ -1521,9 +1525,6 @@ fn check_expr_fn_with_unifier(fcx: @fn_ctxt, unify(fcx, expr.span, expected, fty); check_fn1(fcx.ccx, decl, proto, body, expr.id, some(fcx)); - if proto == ast::proto_block { - write::ty_only_fixup(fcx, expr.id, expected); - } } fn check_expr_with_unifier(fcx: @fn_ctxt, expr: @ast::expr, unify: unifier, @@ -1979,11 +1980,20 @@ fn check_expr_with_unifier(fcx: @fn_ctxt, expr: @ast::expr, unify: unifier, // Take the prototype from the expected type, but default to block: let proto = alt ty::struct(tcx, expected) { ty::ty_fn(proto, _, _, _, _) { proto } - _ { ast::proto_block } + _ { + fcx.ccx.tcx.sess.span_warn( + expr.span, + "unable to infer kind of closure, defaulting to block"); + ast::proto_block + } }; + log #fmt("checking expr_fn_block %s expected=%s", + expr_to_str(expr), + ty_to_str(tcx, expected)); check_expr_fn_with_unifier(fcx, expr, decl, proto, body, unify, expected); + write::ty_only_fixup(fcx, id, expected); } ast::expr_block(b) { // If this is an unchecked block, turn off purity-checking diff --git a/src/comp/syntax/print/pprust.rs b/src/comp/syntax/print/pprust.rs index 5832140b230..4ac884171b3 100644 --- a/src/comp/syntax/print/pprust.rs +++ b/src/comp/syntax/print/pprust.rs @@ -1161,6 +1161,11 @@ fn print_fn_block_args(s: ps, decl: ast::fn_decl) { } commasep(s, inconsistent, decl.inputs, print_arg); word(s.s, "|"); + if decl.output.node != ast::ty_infer { + space_if_not_bol(s); + word_space(s, "->"); + print_type(s, decl.output); + } maybe_print_comment(s, decl.output.span.lo); } |
