Skip to content

Commit 64596e6

Browse files
Eric Holkbrson
Eric Holk
authored andcommitted
Teach the parser and typechecker to understand port[int](). Closes #588
1 parent 1c6ae8c commit 64596e6

File tree

11 files changed

+85
-11
lines changed

11 files changed

+85
-11
lines changed

src/comp/front/ast.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ tag expr_ {
290290
/* FIXME Would be nice if expr_check desugared
291291
to expr_if_check. */
292292
expr_if_check(@expr, block, option::t[@expr]);
293-
expr_port;
293+
expr_port(option::t[@ty]);
294294
expr_chan(@expr);
295295
expr_anon_obj(anon_obj, vec[ty_param], obj_def_ids);
296296
}

src/comp/front/fold.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,12 @@ fn noop_fold_expr(&expr_ e, ast_fold fld) -> expr_ {
405405
case (expr_log(?lv, ?e)) { expr_log(lv, fld.fold_expr(e)) }
406406
case (expr_assert(?e)) { expr_assert(fld.fold_expr(e)) }
407407
case (expr_check(?e)) { expr_check(fld.fold_expr(e)) }
408-
case (expr_port()) { e }
408+
case (expr_port(?ot)) {
409+
expr_port(alt(ot) {
410+
case (option::some(?t)) { option::some(fld.fold_ty(t)) }
411+
case (option::none) { option::none }
412+
})
413+
}
409414
case (expr_chan(?e)) { expr_chan(fld.fold_expr(e)) }
410415
case (expr_anon_obj(?ao, ?typms, ?odis)) {
411416
expr_anon_obj(fold_anon_obj(ao), typms, odis)

src/comp/front/parser.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -899,10 +899,16 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
899899
ex = ast::expr_be(e);
900900
} else { p.fatal("Non-call expression in tail call"); }
901901
} else if (eat_word(p, "port")) {
902+
auto ty = none;
903+
if(token::LBRACKET == p.peek()) {
904+
expect(p, token::LBRACKET);
905+
ty = some(parse_ty(p));
906+
expect(p, token::RBRACKET);
907+
}
902908
expect(p, token::LPAREN);
903909
expect(p, token::RPAREN);
904910
hi = p.get_hi_pos();
905-
ex = ast::expr_port;
911+
ex = ast::expr_port(ty);
906912
} else if (eat_word(p, "chan")) {
907913
expect(p, token::LPAREN);
908914
auto e = parse_expr(p);
@@ -1592,7 +1598,7 @@ fn stmt_ends_with_semi(&ast::stmt stmt) -> bool {
15921598
case (ast::expr_log(_, _)) { true }
15931599
case (ast::expr_check(_)) { true }
15941600
case (ast::expr_if_check(_, _, _)) { false }
1595-
case (ast::expr_port) { true }
1601+
case (ast::expr_port(_)) { true }
15961602
case (ast::expr_chan(_)) { true }
15971603
case (ast::expr_anon_obj(_,_,_)) { false }
15981604
case (ast::expr_assert(_)) { true }

src/comp/middle/trans.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5996,7 +5996,7 @@ fn trans_expr_out(&@block_ctxt cx, &@ast::expr e, out_method output) ->
59965996
case (ast::expr_ret(?ex)) { ret trans_ret(cx, ex); }
59975997
case (ast::expr_put(?ex)) { ret trans_put(cx, ex); }
59985998
case (ast::expr_be(?ex)) { ret trans_be(cx, ex); }
5999-
case (ast::expr_port) { ret trans_port(cx, e.id); }
5999+
case (ast::expr_port(_)) { ret trans_port(cx, e.id); }
60006000
case (ast::expr_chan(?ex)) { ret trans_chan(cx, ex, e.id); }
60016001
case (ast::expr_send(?lhs, ?rhs)) {
60026002
ret trans_send(cx, lhs, rhs, e.id);

src/comp/middle/tstate/pre_post_conditions.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ fn find_pre_post_expr(&fn_ctxt fcx, @expr e) {
556556
}
557557
case (expr_break) { clear_pp(expr_pp(fcx.ccx, e)); }
558558
case (expr_cont) { clear_pp(expr_pp(fcx.ccx, e)); }
559-
case (expr_port) { clear_pp(expr_pp(fcx.ccx, e)); }
559+
case (expr_port(_)) { clear_pp(expr_pp(fcx.ccx, e)); }
560560
case (expr_ext(_, _, _, ?expanded)) {
561561
find_pre_post_expr(fcx, expanded);
562562
copy_pre_post(fcx.ccx, e.id, expanded);

src/comp/middle/tstate/states.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ fn find_pre_post_state_expr(&fn_ctxt fcx, &prestate pres, @expr e) -> bool {
565565
}
566566
case (expr_break) { ret pure_exp(fcx.ccx, e.id, pres); }
567567
case (expr_cont) { ret pure_exp(fcx.ccx, e.id, pres); }
568-
case (expr_port) { ret pure_exp(fcx.ccx, e.id, pres); }
568+
case (expr_port(_)) { ret pure_exp(fcx.ccx, e.id, pres); }
569569
case (expr_self_method(_)) { ret pure_exp(fcx.ccx, e.id, pres); }
570570
case (expr_anon_obj(?anon_obj, _, _)) {
571571
alt (anon_obj.with_obj) {

src/comp/middle/typeck.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -2075,8 +2075,16 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) {
20752075
}
20762076
}
20772077
}
2078-
case (ast::expr_port) {
2078+
case (ast::expr_port(?typ)) {
20792079
auto t = next_ty_var(fcx);
2080+
alt(typ) {
2081+
case (some(?_t)) {
2082+
demand::simple(fcx, expr.span,
2083+
ast_ty_to_ty_crate(fcx.ccx, _t),
2084+
t);
2085+
}
2086+
case (none) {}
2087+
}
20802088
auto pt = ty::mk_port(fcx.ccx.tcx, t);
20812089
write::ty_only_fixup(fcx, id, pt);
20822090
}

src/comp/middle/visit.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ fn visit_expr[E](&@expr ex, &E e, &vt[E] v) {
374374
case (expr_log(_, ?x)) { vt(v).visit_expr(x, e, v); }
375375
case (expr_check(?x)) { vt(v).visit_expr(x, e, v); }
376376
case (expr_assert(?x)) { vt(v).visit_expr(x, e, v); }
377-
case (expr_port) { }
377+
case (expr_port(_)) { }
378378
case (expr_chan(?x)) { vt(v).visit_expr(x, e, v); }
379379
case (expr_anon_obj(?anon_obj, _, _)) {
380380
alt (anon_obj.fields) {

src/comp/middle/walk.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ fn walk_expr(&ast_visitor v, @ast::expr e) {
380380
case (ast::expr_log(_, ?x)) { walk_expr(v, x); }
381381
case (ast::expr_check(?x)) { walk_expr(v, x); }
382382
case (ast::expr_assert(?x)) { walk_expr(v, x); }
383-
case (ast::expr_port) { }
383+
case (ast::expr_port(_)) { }
384384
case (ast::expr_chan(?x)) { walk_expr(v, x); }
385385
case (ast::expr_anon_obj(?anon_obj, _, _)) {
386386
// Fields

src/comp/pretty/pprust.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -882,7 +882,18 @@ fn print_expr(&ps s, &@ast::expr expr) {
882882
// FIXME: extension 'body'
883883

884884
}
885-
case (ast::expr_port) { word(s.s, "port"); popen(s); pclose(s); }
885+
case (ast::expr_port(?ot)) {
886+
word(s.s, "port");
887+
alt(ot) {
888+
case(some(?t)) {
889+
word(s.s, "[");
890+
print_type(s, *t);
891+
word(s.s, "]");
892+
}
893+
case(none) {}
894+
}
895+
popen(s); pclose(s);
896+
}
886897
case (ast::expr_chan(?expr)) {
887898
word(s.s, "chan");
888899
popen(s);

src/test/run-pass/task-compare.rs

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// xfail-stage0
2+
// xfail-stage1
3+
// xfail-stage2
4+
5+
/**
6+
A test case for issue #577, which also exposes #588
7+
*/
8+
9+
use std;
10+
import std::task::join;
11+
12+
fn child() {}
13+
14+
fn main() {
15+
// tasks
16+
auto t1; auto t2;
17+
18+
t1 = spawn child();
19+
t2 = spawn child();
20+
21+
assert(t1 == t1);
22+
assert(t1 != t2);
23+
24+
// ports
25+
auto p1; auto p2;
26+
27+
p1 = port[int]();
28+
p2 = port[int]();
29+
30+
assert(p1 == p1);
31+
assert(p1 != p2);
32+
33+
// channels
34+
auto c1; auto c2;
35+
36+
c1 = chan(p1);
37+
c2 = chan(p2);
38+
39+
assert(c1 == c1);
40+
assert(c1 != c2);
41+
42+
join(t1);
43+
join(t2);
44+
}

0 commit comments

Comments
 (0)