Skip to content

Commit 3fedb18

Browse files
committed
Allow the else part of an expr_if to be either expr_if or expr_block
1 parent c848ed1 commit 3fedb18

File tree

5 files changed

+55
-30
lines changed

5 files changed

+55
-30
lines changed

src/comp/front/ast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ tag expr_ {
149149
expr_unary(unop, @expr, ann);
150150
expr_lit(@lit, ann);
151151
expr_cast(@expr, @ty, ann);
152-
expr_if(@expr, block, option.t[block], ann);
152+
expr_if(@expr, block, option.t[@expr], ann);
153153
expr_while(@expr, block, ann);
154154
expr_for(@decl, @expr, block, ann);
155155
expr_do_while(block, @expr, ann);

src/comp/front/parser.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -891,30 +891,29 @@ impure fn parse_if_expr(parser p) -> @ast.expr {
891891
auto cond = parse_expr(p);
892892
expect(p, token.RPAREN);
893893
auto thn = parse_block(p);
894-
let option.t[ast.block] els = none[ast.block];
894+
let option.t[@ast.expr] els = none[@ast.expr];
895895
hi = thn.span;
896896
alt (p.peek()) {
897897
case (token.ELSE) {
898-
auto eblk = parse_else_block(p);
899-
els = some(eblk);
900-
hi = eblk.span;
898+
auto elexpr = parse_else_expr(p);
899+
els = some(elexpr);
900+
hi = elexpr.span;
901901
}
902902
case (_) { /* fall through */ }
903903
}
904904
ret @spanned(lo, hi, ast.expr_if(cond, thn, els, ast.ann_none));
905905
}
906906

907-
impure fn parse_else_block(parser p) -> ast.block {
907+
impure fn parse_else_expr(parser p) -> @ast.expr {
908908
expect(p, token.ELSE);
909909
alt (p.peek()) {
910910
case (token.IF) {
911-
let vec[@ast.stmt] stmts = vec();
912-
auto ifexpr = parse_if_expr(p);
913-
auto bloc = index_block(stmts, some(ifexpr));
914-
ret spanned(ifexpr.span, ifexpr.span, bloc);
911+
ret parse_if_expr(p);
915912
}
916913
case (_) {
917-
ret parse_block(p);
914+
auto blk = parse_block(p);
915+
ret @spanned(blk.span, blk.span,
916+
ast.expr_block(blk, ast.ann_none));
918917
}
919918
}
920919
}

src/comp/middle/fold.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ type ast_fold[ENV] =
100100

101101
(fn(&ENV e, &span sp,
102102
@expr cond, &block thn,
103-
&option.t[block] els,
103+
&option.t[@expr] els,
104104
ann a) -> @expr) fold_expr_if,
105105

106106
(fn(&ENV e, &span sp,
@@ -504,10 +504,10 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
504504
case (ast.expr_if(?cnd, ?thn, ?els, ?t)) {
505505
auto ccnd = fold_expr(env_, fld, cnd);
506506
auto tthn = fold_block(env_, fld, thn);
507-
auto eels = none[block];
507+
auto eels = none[@expr];
508508
alt (els) {
509-
case (some[block](?b)) {
510-
eels = some(fold_block(env_, fld, b));
509+
case (some[@expr](?e)) {
510+
eels = some(fold_expr(env_, fld, e));
511511
}
512512
case (_) { /* fall through */ }
513513
}
@@ -961,7 +961,7 @@ fn identity_fold_expr_cast[ENV](&ENV env, &span sp, @ast.expr e,
961961

962962
fn identity_fold_expr_if[ENV](&ENV env, &span sp,
963963
@expr cond, &block thn,
964-
&option.t[block] els, ann a) -> @expr {
964+
&option.t[@expr] els, ann a) -> @expr {
965965
ret @respan(sp, ast.expr_if(cond, thn, els, a));
966966
}
967967

src/comp/middle/trans.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1931,7 +1931,7 @@ fn join_results(@block_ctxt parent_cx,
19311931
}
19321932

19331933
fn trans_if(@block_ctxt cx, @ast.expr cond,
1934-
&ast.block thn, &option.t[ast.block] els) -> result {
1934+
&ast.block thn, &option.t[@ast.expr] els) -> result {
19351935

19361936
auto cond_res = trans_expr(cx, cond);
19371937

@@ -1942,8 +1942,19 @@ fn trans_if(@block_ctxt cx, @ast.expr cond,
19421942
auto else_res = res(else_cx, C_nil());
19431943

19441944
alt (els) {
1945-
case (some[ast.block](?eblk)) {
1946-
else_res = trans_block(else_cx, eblk);
1945+
case (some[@ast.expr](?elexpr)) {
1946+
// FIXME: Shouldn't need to unwrap the block here,
1947+
// instead just use 'else_res = trans_expr(else_cx, elexpr)',
1948+
// but either a) trans_expr doesn't handle expr_block
1949+
// correctly or b) I have no idea what I'm doing...
1950+
alt (elexpr.node) {
1951+
case (ast.expr_if(_, _, _, _)) {
1952+
else_res = trans_expr(else_cx, elexpr);
1953+
}
1954+
case (ast.expr_block(?b, _)) {
1955+
else_res = trans_block(else_cx, b);
1956+
}
1957+
}
19471958
}
19481959
case (_) { /* fall through */ }
19491960
}

src/comp/middle/typeck.rs

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -870,10 +870,10 @@ fn demand_expr_full(&@fn_ctxt fcx, @ty.t expected, @ast.expr e,
870870
auto then_1 = demand_block(fcx, expected, then_0);
871871
auto else_1;
872872
alt (else_0) {
873-
case (none[ast.block]) { else_1 = none[ast.block]; }
874-
case (some[ast.block](?b_0)) {
875-
auto b_1 = demand_block(fcx, expected, b_0);
876-
else_1 = some[ast.block](b_1);
873+
case (none[@ast.expr]) { else_1 = none[@ast.expr]; }
874+
case (some[@ast.expr](?e_0)) {
875+
auto e_1 = demand_expr(fcx, expected, e_0);
876+
else_1 = some[@ast.expr](e_1);
877877
}
878878
}
879879
e_1 = ast.expr_if(cond, then_1, else_1, ast.ann_type(t));
@@ -1205,14 +1205,14 @@ fn check_expr(&@fn_ctxt fcx, @ast.expr expr) -> @ast.expr {
12051205
auto elsopt_1;
12061206
auto elsopt_t;
12071207
alt (elsopt) {
1208-
case (some[ast.block](?els)) {
1209-
auto els_0 = check_block(fcx, els);
1210-
auto els_1 = demand_block(fcx, thn_t, els_0);
1211-
elsopt_1 = some[ast.block](els_1);
1212-
elsopt_t = block_ty(els_1);
1208+
case (some[@ast.expr](?els)) {
1209+
auto els_0 = check_expr(fcx, els);
1210+
auto els_1 = demand_expr(fcx, thn_t, els_0);
1211+
elsopt_1 = some[@ast.expr](els_1);
1212+
elsopt_t = expr_ty(els_1);
12131213
}
1214-
case (none[ast.block]) {
1215-
elsopt_1 = none[ast.block];
1214+
case (none[@ast.expr]) {
1215+
elsopt_1 = none[@ast.expr];
12161216
elsopt_t = plain_ty(ty.ty_nil);
12171217
}
12181218
}
@@ -1308,6 +1308,21 @@ fn check_expr(&@fn_ctxt fcx, @ast.expr expr) -> @ast.expr {
13081308
ast.expr_alt(expr_1, arms_1, ann));
13091309
}
13101310

1311+
case (ast.expr_block(?b, _)) {
1312+
auto b_0 = check_block(fcx, b);
1313+
auto ann;
1314+
alt (b_0.node.expr) {
1315+
case (some[@ast.expr](?expr)) {
1316+
ann = ast.ann_type(expr_ty(expr));
1317+
}
1318+
case (none[@ast.expr]) {
1319+
ann = ast.ann_type(plain_ty(ty.ty_nil));
1320+
}
1321+
}
1322+
ret @fold.respan[ast.expr_](expr.span,
1323+
ast.expr_block(b_0, ann));
1324+
}
1325+
13111326
case (ast.expr_bind(?f, ?args, _)) {
13121327
auto f_0 = check_expr(fcx, f);
13131328
auto t_0 = expr_ty(f_0);

0 commit comments

Comments
 (0)