Skip to content

Commit 15a01f5

Browse files
committed
Add basic front-end support for expr_put.
1 parent f1f33ab commit 15a01f5

File tree

6 files changed

+68
-0
lines changed

6 files changed

+68
-0
lines changed

src/comp/front/ast.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ tag expr_ {
162162
expr_ext(vec[@expr], option.t[@expr], ann);
163163
expr_fail;
164164
expr_ret(option.t[@expr]);
165+
expr_put(option.t[@expr]);
165166
expr_be(@expr);
166167
expr_log(@expr);
167168
expr_check_expr(@expr);

src/comp/front/parser.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,20 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
638638
}
639639
}
640640

641+
case (token.PUT) {
642+
p.bump();
643+
alt (p.peek()) {
644+
case (token.SEMI) {
645+
ex = ast.expr_put(none[@ast.expr]);
646+
}
647+
case (_) {
648+
auto e = parse_expr(p);
649+
hi = e.span;
650+
ex = ast.expr_put(some[@ast.expr](e));
651+
}
652+
}
653+
}
654+
641655
case (token.BE) {
642656
p.bump();
643657
auto e = parse_expr(p);
@@ -1420,6 +1434,7 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
14201434
case (ast.expr_path(_,_,_)) { ret true; }
14211435
case (ast.expr_fail) { ret true; }
14221436
case (ast.expr_ret(_)) { ret true; }
1437+
case (ast.expr_put(_)) { ret true; }
14231438
case (ast.expr_be(_)) { ret true; }
14241439
case (ast.expr_log(_)) { ret true; }
14251440
case (ast.expr_check_expr(_)) { ret true; }

src/comp/middle/fold.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,9 @@ type ast_fold[ENV] =
154154
(fn(&ENV e, &span sp,
155155
&option.t[@expr] rv) -> @expr) fold_expr_ret,
156156

157+
(fn(&ENV e, &span sp,
158+
&option.t[@expr] rv) -> @expr) fold_expr_put,
159+
157160
(fn(&ENV e, &span sp,
158161
@expr e) -> @expr) fold_expr_be,
159162

@@ -640,6 +643,17 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
640643
ret fld.fold_expr_ret(env_, e.span, oee);
641644
}
642645

646+
case (ast.expr_put(?oe)) {
647+
auto oee = none[@expr];
648+
alt (oe) {
649+
case (some[@expr](?x)) {
650+
oee = some(fold_expr(env_, fld, x));
651+
}
652+
case (_) { /* fall through */ }
653+
}
654+
ret fld.fold_expr_put(env_, e.span, oee);
655+
}
656+
643657
case (ast.expr_be(?x)) {
644658
auto ee = fold_expr(env_, fld, x);
645659
ret fld.fold_expr_be(env_, e.span, ee);
@@ -1130,6 +1144,11 @@ fn identity_fold_expr_ret[ENV](&ENV env, &span sp,
11301144
ret @respan(sp, ast.expr_ret(rv));
11311145
}
11321146

1147+
fn identity_fold_expr_put[ENV](&ENV env, &span sp,
1148+
&option.t[@expr] rv) -> @expr {
1149+
ret @respan(sp, ast.expr_put(rv));
1150+
}
1151+
11331152
fn identity_fold_expr_be[ENV](&ENV env, &span sp, @expr x) -> @expr {
11341153
ret @respan(sp, ast.expr_be(x));
11351154
}
@@ -1396,6 +1415,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
13961415
fold_expr_path = bind identity_fold_expr_path[ENV](_,_,_,_,_),
13971416
fold_expr_fail = bind identity_fold_expr_fail[ENV](_,_),
13981417
fold_expr_ret = bind identity_fold_expr_ret[ENV](_,_,_),
1418+
fold_expr_put = bind identity_fold_expr_put[ENV](_,_,_),
13991419
fold_expr_be = bind identity_fold_expr_be[ENV](_,_,_),
14001420
fold_expr_log = bind identity_fold_expr_log[ENV](_,_,_),
14011421
fold_expr_check_expr

src/comp/middle/trans.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3122,6 +3122,10 @@ fn trans_expr(@block_ctxt cx, @ast.expr e) -> result {
31223122
ret trans_ret(cx, e);
31233123
}
31243124

3125+
case (ast.expr_ret(?e)) {
3126+
ret trans_put(cx, e);
3127+
}
3128+
31253129
case (ast.expr_be(?e)) {
31263130
ret trans_be(cx, e);
31273131
}
@@ -3199,6 +3203,11 @@ fn trans_fail(@block_ctxt cx, common.span sp, str fail_str) -> result {
31993203
ret trans_upcall(cx, "upcall_fail", args);
32003204
}
32013205

3206+
fn trans_put(@block_ctxt cx, &option.t[@ast.expr] e) -> result {
3207+
cx.fcx.ccx.sess.unimpl("put expr");
3208+
fail;
3209+
}
3210+
32023211
fn trans_ret(@block_ctxt cx, &option.t[@ast.expr] e) -> result {
32033212
auto bcx = cx;
32043213
auto val = C_nil();

src/comp/middle/ty.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,7 @@ fn expr_ty(@ast.expr expr) -> @t {
691691
case (ast.expr_log(_)) { ret plain_ty(ty_nil); }
692692
case (ast.expr_check_expr(_)) { ret plain_ty(ty_nil); }
693693
case (ast.expr_ret(_)) { ret plain_ty(ty_nil); }
694+
case (ast.expr_put(_)) { ret plain_ty(ty_nil); }
694695
case (ast.expr_be(_)) { ret plain_ty(ty_nil); }
695696
}
696697
fail;

src/comp/middle/typeck.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1040,6 +1040,7 @@ fn demand_expr_full(&@fn_ctxt fcx, @ty.t expected, @ast.expr e,
10401040
case (ast.expr_fail) { e_1 = e.node; }
10411041
case (ast.expr_log(_)) { e_1 = e.node; }
10421042
case (ast.expr_ret(_)) { e_1 = e.node; }
1043+
case (ast.expr_put(_)) { e_1 = e.node; }
10431044
case (ast.expr_be(_)) { e_1 = e.node; }
10441045
case (ast.expr_check_expr(_)) { e_1 = e.node; }
10451046
}
@@ -1317,6 +1318,27 @@ fn check_expr(&@fn_ctxt fcx, @ast.expr expr) -> @ast.expr {
13171318
}
13181319
}
13191320

1321+
case (ast.expr_put(?expr_opt)) {
1322+
alt (expr_opt) {
1323+
case (none[@ast.expr]) {
1324+
auto nil = plain_ty(ty.ty_nil);
1325+
if (!are_compatible(fcx, fcx.ret_ty, nil)) {
1326+
fcx.ccx.sess.err("put; in function "
1327+
+ "putting non-nil");
1328+
}
1329+
1330+
ret expr;
1331+
}
1332+
1333+
case (some[@ast.expr](?e)) {
1334+
auto expr_0 = check_expr(fcx, e);
1335+
auto expr_1 = demand_expr(fcx, fcx.ret_ty, expr_0);
1336+
ret @fold.respan[ast.expr_](expr.span,
1337+
ast.expr_put(some(expr_1)));
1338+
}
1339+
}
1340+
}
1341+
13201342
case (ast.expr_be(?e)) {
13211343
/* FIXME: prove instead of check */
13221344
check ast.is_call_expr(e);

0 commit comments

Comments
 (0)