Skip to content
/ rust Public
forked from rust-lang/rust

Commit 79b6ed0

Browse files
committed
Only early return if recovered
1 parent faa7395 commit 79b6ed0

File tree

1 file changed

+20
-15
lines changed

1 file changed

+20
-15
lines changed

compiler/rustc_parse/src/parser/diagnostics.rs

+20-15
Original file line numberDiff line numberDiff line change
@@ -500,8 +500,7 @@ impl<'a> Parser<'a> {
500500

501501
// Special-case "expected `;`" errors
502502
if expected.contains(&TokenType::Token(token::Semi)) {
503-
if self.prev_token.kind == token::Question {
504-
self.maybe_recover_from_ternary_operator();
503+
if self.prev_token == token::Question && self.maybe_recover_from_ternary_operator() {
505504
return Ok(true);
506505
}
507506

@@ -1336,26 +1335,30 @@ impl<'a> Parser<'a> {
13361335
}
13371336

13381337
/// Rust has no ternary operator (`cond ? then : else`). Parse it and try
1339-
/// to recover from it if `then` and `else` are valid expressions.
1340-
pub(super) fn maybe_recover_from_ternary_operator(&mut self) {
1341-
let snapshot = self.create_snapshot_for_diagnostic();
1338+
/// to recover from it if `then` and `else` are valid expressions. Returns
1339+
/// whether it was a ternary operator.
1340+
pub(super) fn maybe_recover_from_ternary_operator(&mut self) -> bool {
1341+
if self.prev_token != token::Question {
1342+
return false;
1343+
}
1344+
13421345
let lo = self.prev_token.span.lo();
1346+
let snapshot = self.create_snapshot_for_diagnostic();
13431347

1344-
if self.prev_token == token::Question
1345-
&& match self.parse_expr() {
1346-
Ok(_) => true,
1347-
Err(err) => {
1348-
err.cancel();
1349-
// The colon can sometimes be mistaken for type
1350-
// ascription. Catch when this happens and continue.
1351-
self.token == token::Colon
1352-
}
1348+
if match self.parse_expr() {
1349+
Ok(_) => true,
1350+
Err(err) => {
1351+
err.cancel();
1352+
// The colon can sometimes be mistaken for type
1353+
// ascription. Catch when this happens and continue.
1354+
self.token == token::Colon
13531355
}
1354-
{
1356+
} {
13551357
if self.eat_noexpect(&token::Colon) {
13561358
match self.parse_expr() {
13571359
Ok(_) => {
13581360
self.sess.emit_err(TernaryOperator { span: self.token.span.with_lo(lo) });
1361+
return true;
13591362
}
13601363
Err(err) => {
13611364
err.cancel();
@@ -1366,6 +1369,8 @@ impl<'a> Parser<'a> {
13661369
} else {
13671370
self.restore_snapshot(snapshot);
13681371
};
1372+
1373+
false
13691374
}
13701375

13711376
pub(super) fn maybe_recover_from_bad_type_plus(&mut self, ty: &Ty) -> PResult<'a, ()> {

0 commit comments

Comments
 (0)