diff options
| author | bors <bors@rust-lang.org> | 2016-08-27 03:07:48 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-08-27 03:07:48 -0700 |
| commit | 099b9fdb1a170b57ffd7174b3c3042cc86b7fe91 (patch) | |
| tree | aa3b27019254450634a4fea8583e7cc70d7b7190 /src/libsyntax/parse/parser.rs | |
| parent | 6b74503aa4f2fb4035d9adef9391e9b9658c57ad (diff) | |
| parent | 668d63132e23999f5a74fe65c8c0590a4d9ca215 (diff) | |
| download | rust-099b9fdb1a170b57ffd7174b3c3042cc86b7fe91.tar.gz rust-099b9fdb1a170b57ffd7174b3c3042cc86b7fe91.zip | |
Auto merge of #36030 - Manishearth:rollup, r=Manishearth
Rollup of 7 pull requests - Successful merges: #35124, #35877, #35953, #36002, #36004, #36005, #36014 - Failed merges:
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 9443df6321b..1646246069e 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -4087,9 +4087,30 @@ impl<'a> Parser<'a> { if !self.eat(&token::OpenDelim(token::Brace)) { let sp = self.span; let tok = self.this_token_to_string(); - return Err(self.span_fatal_help(sp, - &format!("expected `{{`, found `{}`", tok), - "place this code inside a block")); + let mut e = self.span_fatal(sp, &format!("expected `{{`, found `{}`", tok)); + + // Check to see if the user has written something like + // + // if (cond) + // bar; + // + // Which is valid in other languages, but not Rust. + match self.parse_stmt_without_recovery(false) { + Ok(Some(stmt)) => { + let mut stmt_span = stmt.span; + // expand the span to include the semicolon, if it exists + if self.eat(&token::Semi) { + stmt_span.hi = self.last_span.hi; + } + e.span_help(stmt_span, "try placing this code inside a block"); + } + Err(mut e) => { + self.recover_stmt_(SemiColonMode::Break); + e.cancel(); + } + _ => () + } + return Err(e); } self.parse_block_tail(lo, BlockCheckMode::Default) |
