Skip to content

Commit 214c323

Browse files
committed
Teach rustc to parse 'else if'
1 parent bf9cebf commit 214c323

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

src/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,7 @@ TEST_XFAILS_RUSTC := $(filter-out \
447447
div-mod.rs \
448448
drop-bind-thunk-args.rs \
449449
drop-on-ret.rs \
450+
else-if.rs \
450451
fact.rs \
451452
fn-lval.rs \
452453
fun-call-variants.rs \

src/comp/front/parser.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -895,8 +895,7 @@ impure fn parse_if_expr(parser p) -> @ast.expr {
895895
hi = thn.span;
896896
alt (p.peek()) {
897897
case (token.ELSE) {
898-
p.bump();
899-
auto eblk = parse_block(p);
898+
auto eblk = parse_else_block(p);
900899
els = some(eblk);
901900
hi = eblk.span;
902901
}
@@ -905,6 +904,21 @@ impure fn parse_if_expr(parser p) -> @ast.expr {
905904
ret @spanned(lo, hi, ast.expr_if(cond, thn, els, ast.ann_none));
906905
}
907906

907+
impure fn parse_else_block(parser p) -> ast.block {
908+
expect(p, token.ELSE);
909+
alt (p.peek()) {
910+
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);
915+
}
916+
case (_) {
917+
ret parse_block(p);
918+
}
919+
}
920+
}
921+
908922
impure fn parse_head_local(parser p) -> @ast.decl {
909923
auto lo = p.get_span();
910924
let @ast.local local;

0 commit comments

Comments
 (0)