about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2011-12-20 16:18:18 -0800
committerNiko Matsakis <niko@alum.mit.edu>2011-12-21 06:14:35 -0800
commit01cb1044f74b69e128bd73651971ef365954a0ba (patch)
treef93199362abf618b617025d7f1daa835f324b129
parent6a901409410fc2fbc6722eb7b352008135252cec (diff)
downloadrust-01cb1044f74b69e128bd73651971ef365954a0ba.tar.gz
rust-01cb1044f74b69e128bd73651971ef365954a0ba.zip
update pprinter to understand ret type of block, add warnings
-rw-r--r--src/comp/middle/typeck.rs18
-rw-r--r--src/comp/syntax/print/pprust.rs5
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);
 }