From 76ce71c10a72caf0a929176da2b07515cdbde698 Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Tue, 28 Jun 2011 15:54:16 -0700 Subject: [PATCH] Teach the parser and typechecker to understand port[int](). Closes #588 --- src/comp/front/ast.rs | 2 +- src/comp/front/fold.rs | 7 ++- src/comp/front/parser.rs | 10 ++++- src/comp/middle/trans.rs | 2 +- src/comp/middle/tstate/pre_post_conditions.rs | 2 +- src/comp/middle/tstate/states.rs | 2 +- src/comp/middle/typeck.rs | 10 ++++- src/comp/middle/visit.rs | 2 +- src/comp/middle/walk.rs | 2 +- src/comp/pretty/pprust.rs | 13 +++++- src/test/run-pass/task-compare.rs | 44 +++++++++++++++++++ 11 files changed, 85 insertions(+), 11 deletions(-) create mode 100644 src/test/run-pass/task-compare.rs diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs index e36c033823825..f63a563621136 100644 --- a/src/comp/front/ast.rs +++ b/src/comp/front/ast.rs @@ -290,7 +290,7 @@ tag expr_ { /* FIXME Would be nice if expr_check desugared to expr_if_check. */ expr_if_check(@expr, block, option::t[@expr]); - expr_port; + expr_port(option::t[@ty]); expr_chan(@expr); expr_anon_obj(anon_obj, vec[ty_param], obj_def_ids); } diff --git a/src/comp/front/fold.rs b/src/comp/front/fold.rs index d39c306076248..9c9b08d9dac20 100644 --- a/src/comp/front/fold.rs +++ b/src/comp/front/fold.rs @@ -405,7 +405,12 @@ fn noop_fold_expr(&expr_ e, ast_fold fld) -> expr_ { case (expr_log(?lv, ?e)) { expr_log(lv, fld.fold_expr(e)) } case (expr_assert(?e)) { expr_assert(fld.fold_expr(e)) } case (expr_check(?e)) { expr_check(fld.fold_expr(e)) } - case (expr_port()) { e } + case (expr_port(?ot)) { + expr_port(alt(ot) { + case (option::some(?t)) { option::some(fld.fold_ty(t)) } + case (option::none) { option::none } + }) + } case (expr_chan(?e)) { expr_chan(fld.fold_expr(e)) } case (expr_anon_obj(?ao, ?typms, ?odis)) { expr_anon_obj(fold_anon_obj(ao), typms, odis) diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index 801a02d6511f1..454e00ea77a96 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -899,10 +899,16 @@ fn parse_bottom_expr(&parser p) -> @ast::expr { ex = ast::expr_be(e); } else { p.fatal("Non-call expression in tail call"); } } else if (eat_word(p, "port")) { + auto ty = none; + if(token::LBRACKET == p.peek()) { + expect(p, token::LBRACKET); + ty = some(parse_ty(p)); + expect(p, token::RBRACKET); + } expect(p, token::LPAREN); expect(p, token::RPAREN); hi = p.get_hi_pos(); - ex = ast::expr_port; + ex = ast::expr_port(ty); } else if (eat_word(p, "chan")) { expect(p, token::LPAREN); auto e = parse_expr(p); @@ -1592,7 +1598,7 @@ fn stmt_ends_with_semi(&ast::stmt stmt) -> bool { case (ast::expr_log(_, _)) { true } case (ast::expr_check(_)) { true } case (ast::expr_if_check(_, _, _)) { false } - case (ast::expr_port) { true } + case (ast::expr_port(_)) { true } case (ast::expr_chan(_)) { true } case (ast::expr_anon_obj(_,_,_)) { false } case (ast::expr_assert(_)) { true } diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index aed4d3b753e27..428076e46bac7 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -5996,7 +5996,7 @@ fn trans_expr_out(&@block_ctxt cx, &@ast::expr e, out_method output) -> case (ast::expr_ret(?ex)) { ret trans_ret(cx, ex); } case (ast::expr_put(?ex)) { ret trans_put(cx, ex); } case (ast::expr_be(?ex)) { ret trans_be(cx, ex); } - case (ast::expr_port) { ret trans_port(cx, e.id); } + case (ast::expr_port(_)) { ret trans_port(cx, e.id); } case (ast::expr_chan(?ex)) { ret trans_chan(cx, ex, e.id); } case (ast::expr_send(?lhs, ?rhs)) { ret trans_send(cx, lhs, rhs, e.id); diff --git a/src/comp/middle/tstate/pre_post_conditions.rs b/src/comp/middle/tstate/pre_post_conditions.rs index 7e97a11d166c5..3e27e665054fb 100644 --- a/src/comp/middle/tstate/pre_post_conditions.rs +++ b/src/comp/middle/tstate/pre_post_conditions.rs @@ -556,7 +556,7 @@ fn find_pre_post_expr(&fn_ctxt fcx, @expr e) { } case (expr_break) { clear_pp(expr_pp(fcx.ccx, e)); } case (expr_cont) { clear_pp(expr_pp(fcx.ccx, e)); } - case (expr_port) { clear_pp(expr_pp(fcx.ccx, e)); } + case (expr_port(_)) { clear_pp(expr_pp(fcx.ccx, e)); } case (expr_ext(_, _, _, ?expanded)) { find_pre_post_expr(fcx, expanded); copy_pre_post(fcx.ccx, e.id, expanded); diff --git a/src/comp/middle/tstate/states.rs b/src/comp/middle/tstate/states.rs index 91ea1a2c01fd1..82274937c8d39 100644 --- a/src/comp/middle/tstate/states.rs +++ b/src/comp/middle/tstate/states.rs @@ -565,7 +565,7 @@ fn find_pre_post_state_expr(&fn_ctxt fcx, &prestate pres, @expr e) -> bool { } case (expr_break) { ret pure_exp(fcx.ccx, e.id, pres); } case (expr_cont) { ret pure_exp(fcx.ccx, e.id, pres); } - case (expr_port) { ret pure_exp(fcx.ccx, e.id, pres); } + case (expr_port(_)) { ret pure_exp(fcx.ccx, e.id, pres); } case (expr_self_method(_)) { ret pure_exp(fcx.ccx, e.id, pres); } case (expr_anon_obj(?anon_obj, _, _)) { alt (anon_obj.with_obj) { diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index faed0b04022ac..a47ef47ed8006 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -2075,8 +2075,16 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) { } } } - case (ast::expr_port) { + case (ast::expr_port(?typ)) { auto t = next_ty_var(fcx); + alt(typ) { + case (some(?_t)) { + demand::simple(fcx, expr.span, + ast_ty_to_ty_crate(fcx.ccx, _t), + t); + } + case (none) {} + } auto pt = ty::mk_port(fcx.ccx.tcx, t); write::ty_only_fixup(fcx, id, pt); } diff --git a/src/comp/middle/visit.rs b/src/comp/middle/visit.rs index 53efe81c4a2d4..98db56e96c3fe 100644 --- a/src/comp/middle/visit.rs +++ b/src/comp/middle/visit.rs @@ -374,7 +374,7 @@ fn visit_expr[E](&@expr ex, &E e, &vt[E] v) { case (expr_log(_, ?x)) { vt(v).visit_expr(x, e, v); } case (expr_check(?x)) { vt(v).visit_expr(x, e, v); } case (expr_assert(?x)) { vt(v).visit_expr(x, e, v); } - case (expr_port) { } + case (expr_port(_)) { } case (expr_chan(?x)) { vt(v).visit_expr(x, e, v); } case (expr_anon_obj(?anon_obj, _, _)) { alt (anon_obj.fields) { diff --git a/src/comp/middle/walk.rs b/src/comp/middle/walk.rs index 821a00ad45082..f4c954298fd79 100644 --- a/src/comp/middle/walk.rs +++ b/src/comp/middle/walk.rs @@ -380,7 +380,7 @@ fn walk_expr(&ast_visitor v, @ast::expr e) { case (ast::expr_log(_, ?x)) { walk_expr(v, x); } case (ast::expr_check(?x)) { walk_expr(v, x); } case (ast::expr_assert(?x)) { walk_expr(v, x); } - case (ast::expr_port) { } + case (ast::expr_port(_)) { } case (ast::expr_chan(?x)) { walk_expr(v, x); } case (ast::expr_anon_obj(?anon_obj, _, _)) { // Fields diff --git a/src/comp/pretty/pprust.rs b/src/comp/pretty/pprust.rs index 5d20a37e809cd..332d4dd3acac4 100644 --- a/src/comp/pretty/pprust.rs +++ b/src/comp/pretty/pprust.rs @@ -882,7 +882,18 @@ fn print_expr(&ps s, &@ast::expr expr) { // FIXME: extension 'body' } - case (ast::expr_port) { word(s.s, "port"); popen(s); pclose(s); } + case (ast::expr_port(?ot)) { + word(s.s, "port"); + alt(ot) { + case(some(?t)) { + word(s.s, "["); + print_type(s, *t); + word(s.s, "]"); + } + case(none) {} + } + popen(s); pclose(s); + } case (ast::expr_chan(?expr)) { word(s.s, "chan"); popen(s); diff --git a/src/test/run-pass/task-compare.rs b/src/test/run-pass/task-compare.rs new file mode 100644 index 0000000000000..de4605ee0c467 --- /dev/null +++ b/src/test/run-pass/task-compare.rs @@ -0,0 +1,44 @@ +// xfail-stage0 +// xfail-stage1 +// xfail-stage2 + +/** + A test case for issue #577, which also exposes #588 +*/ + +use std; +import std::task::join; + +fn child() {} + +fn main() { + // tasks + auto t1; auto t2; + + t1 = spawn child(); + t2 = spawn child(); + + assert(t1 == t1); + assert(t1 != t2); + + // ports + auto p1; auto p2; + + p1 = port[int](); + p2 = port[int](); + + assert(p1 == p1); + assert(p1 != p2); + + // channels + auto c1; auto c2; + + c1 = chan(p1); + c2 = chan(p2); + + assert(c1 == c1); + assert(c1 != c2); + + join(t1); + join(t2); +}