@@ -1477,9 +1477,10 @@ class parser {
1477
1477
// For distingishing between record literals and blocks
1478
1478
fn looking_at_record_literal() -> bool {
1479
1479
let lookahead = self.look_ahead(1);
1480
- self.token_is_keyword(~" mut ", lookahead) ||
1481
- (is_plain_ident(lookahead) &&
1482
- self.look_ahead(2) == token::COLON)
1480
+ self.token == token::LBRACE &&
1481
+ (self.token_is_keyword(~" mut ", lookahead) ||
1482
+ (is_plain_ident(lookahead) &&
1483
+ self.look_ahead(2) == token::COLON))
1483
1484
}
1484
1485
1485
1486
fn parse_record_literal() -> expr_ {
@@ -1518,26 +1519,30 @@ class parser {
1518
1519
let pats = self.parse_pats();
1519
1520
let mut guard = none;
1520
1521
if self.eat_keyword(~" if ") { guard = some(self.parse_expr()); }
1521
- let blk = if self.token != token::FAT_ARROW {
1522
- self.parse_block( )
1522
+ let expr = if self.token != token::FAT_ARROW {
1523
+ self.parse_block_expr(self.last_span.lo, default_blk )
1523
1524
} else {
1524
1525
self.bump();
1525
- if self.token == token::LBRACE
1526
- && !self.looking_at_record_literal() {
1527
- self.parse_block()
1528
- } else {
1529
- let expr = self.parse_expr();
1530
- if self.token != token::RBRACE {
1531
- self.expect(token::COMMA);
1532
- }
1533
- {node: {view_items: ~[],
1534
- stmts: ~[],
1535
- expr: some(expr),
1536
- id: self.get_id(),
1537
- rules: default_blk},
1538
- span: expr.span}
1539
- }
1526
+ self.parse_expr_res(RESTRICT_STMT_EXPR)
1540
1527
};
1528
+
1529
+ let require_comma =
1530
+ classify::expr_requires_semi_to_be_stmt(expr)
1531
+ && self.token != token::RBRACE;
1532
+
1533
+ if require_comma {
1534
+ self.expect(token::COMMA);
1535
+ } else {
1536
+ self.eat(token::COMMA);
1537
+ }
1538
+
1539
+ let blk = {node: {view_items: ~[],
1540
+ stmts: ~[],
1541
+ expr: some(expr),
1542
+ id: self.get_id(),
1543
+ rules: default_blk},
1544
+ span: expr.span};
1545
+
1541
1546
vec::push(arms, {pats: pats, guard: guard, body: blk});
1542
1547
}
1543
1548
let mut hi = self.span.hi;
0 commit comments