Skip to content

Commit 3efb7f5

Browse files
committed
rustc: Push down types for all expressions; add logic for recv and send
1 parent 3557314 commit 3efb7f5

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

src/comp/middle/ty.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -792,6 +792,8 @@ fn expr_ty(@ast.expr expr) -> @t {
792792
case (ast.expr_recv(_, _, ?ann)) { ret ann_to_type(ann); }
793793

794794
case (ast.expr_fail(_)) { ret plain_ty(ty_nil); }
795+
case (ast.expr_break(_)) { ret plain_ty(ty_nil); }
796+
case (ast.expr_cont(_)) { ret plain_ty(ty_nil); }
795797
case (ast.expr_log(_,_)) { ret plain_ty(ty_nil); }
796798
case (ast.expr_check_expr(_,_)) { ret plain_ty(ty_nil); }
797799
case (ast.expr_ret(_,_)) { ret plain_ty(ty_nil); }

src/comp/middle/typeck.rs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,9 +1437,28 @@ mod Pushdown {
14371437
e_1 = ast.expr_alt(discrim, arms_1, triv_ann(t));
14381438
}
14391439

1440+
case (ast.expr_recv(?lval_0, ?expr_0, ?ann)) {
1441+
auto lval_1 = pushdown_expr(fcx, next_ty_var(fcx.ccx),
1442+
lval_0);
1443+
auto t = expr_ty(lval_1);
1444+
auto expr_1 = pushdown_expr(fcx, plain_ty(ty.ty_port(t)),
1445+
expr_0);
1446+
e_1 = ast.expr_recv(lval_1, expr_1, ann);
1447+
}
1448+
1449+
case (ast.expr_send(?lval_0, ?expr_0, ?ann)) {
1450+
auto expr_1 = pushdown_expr(fcx, next_ty_var(fcx.ccx),
1451+
expr_0);
1452+
auto t = expr_ty(expr_1);
1453+
auto lval_1 = pushdown_expr(fcx, plain_ty(ty.ty_chan(t)),
1454+
lval_0);
1455+
e_1 = ast.expr_send(lval_1, expr_1, ann);
1456+
}
1457+
14401458
case (_) {
14411459
fcx.ccx.sess.span_unimpl(e.span,
1442-
"type unification for expression variant");
1460+
#fmt("type unification for expression variant: %s",
1461+
pretty.pprust.expr_to_str(e)));
14431462
fail;
14441463
}
14451464
}
@@ -2591,6 +2610,7 @@ fn check_stmt(&@fn_ctxt fcx, &@ast.stmt stmt) -> @ast.stmt {
25912610

25922611
case (ast.stmt_expr(?expr,?a)) {
25932612
auto expr_t = check_expr(fcx, expr);
2613+
expr_t = Pushdown.pushdown_expr(fcx, expr_ty(expr_t), expr_t);
25942614
ret @fold.respan[ast.stmt_](stmt.span, ast.stmt_expr(expr_t, a));
25952615
}
25962616
}
@@ -2608,7 +2628,9 @@ fn check_block(&@fn_ctxt fcx, &ast.block block) -> ast.block {
26082628
alt (block.node.expr) {
26092629
case (none[@ast.expr]) { /* empty */ }
26102630
case (some[@ast.expr](?e)) {
2611-
expr = some[@ast.expr](check_expr(fcx, e));
2631+
auto expr_t = check_expr(fcx, e);
2632+
expr_t = Pushdown.pushdown_expr(fcx, expr_ty(expr_t), expr_t);
2633+
expr = some[@ast.expr](expr_t);
26122634
}
26132635
}
26142636

0 commit comments

Comments
 (0)