diff options
| author | bors <bors@rust-lang.org> | 2013-09-08 07:45:57 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-09-08 07:45:57 -0700 |
| commit | d36612d65b67e18c7f8d247055f83b28a602e875 (patch) | |
| tree | da8753d901a569992bf4ee1a30c016b377221485 /src/libsyntax/parse | |
| parent | b609d022c4df307e4d68499b063c81a9ecb1e9cf (diff) | |
| parent | 14183114e1048097869a5c56ebfa4a6d71e1a492 (diff) | |
| download | rust-d36612d65b67e18c7f8d247055f83b28a602e875.tar.gz rust-d36612d65b67e18c7f8d247055f83b28a602e875.zip | |
auto merge of #9054 : huonw/rust/labelled-for, r=thestinger
The following parses and works as expected with this change:
```rust
'foo: for i in range(0, 10) {
for j in range(0, 10) {
if i + j == 15 { break 'foo; }
}
}
```
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 8b11a25f13c..b8615352504 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1771,7 +1771,7 @@ impl Parser { } else if self.eat_keyword(keywords::If) { return self.parse_if_expr(); } else if self.eat_keyword(keywords::For) { - return self.parse_for_expr(); + return self.parse_for_expr(None); } else if self.eat_keyword(keywords::Do) { return self.parse_sugary_call_expr(lo, ~"do", DoSugar, ExprDoBody); @@ -1781,8 +1781,13 @@ impl Parser { let lifetime = self.get_lifetime(&*self.token); self.bump(); self.expect(&token::COLON); - self.expect_keyword(keywords::Loop); - return self.parse_loop_expr(Some(lifetime)); + if self.eat_keyword(keywords::For) { + return self.parse_for_expr(Some(lifetime)) + } else if self.eat_keyword(keywords::Loop) { + return self.parse_loop_expr(Some(lifetime)) + } else { + self.fatal("expected `for` or `loop` after a label") + } } else if self.eat_keyword(keywords::Loop) { return self.parse_loop_expr(None); } else if self.eat_keyword(keywords::Match) { @@ -2467,7 +2472,7 @@ impl Parser { } // parse a 'for' .. 'in' expression ('for' token already eaten) - pub fn parse_for_expr(&self) -> @Expr { + pub fn parse_for_expr(&self, opt_ident: Option<ast::Ident>) -> @Expr { // Parse: `for <src_pat> in <src_expr> <src_loop_block>` let lo = self.last_span.lo; @@ -2477,7 +2482,7 @@ impl Parser { let loop_block = self.parse_block(); let hi = self.span.hi; - self.mk_expr(lo, hi, ExprForLoop(pat, expr, loop_block)) + self.mk_expr(lo, hi, ExprForLoop(pat, expr, loop_block, opt_ident)) } |
