@@ -500,8 +500,7 @@ impl<'a> Parser<'a> {
500
500
501
501
// Special-case "expected `;`" errors
502
502
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 ( ) {
505
504
return Ok ( true ) ;
506
505
}
507
506
@@ -1336,26 +1335,30 @@ impl<'a> Parser<'a> {
1336
1335
}
1337
1336
1338
1337
/// 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
+
1342
1345
let lo = self . prev_token . span . lo ( ) ;
1346
+ let snapshot = self . create_snapshot_for_diagnostic ( ) ;
1343
1347
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
1353
1355
}
1354
- {
1356
+ } {
1355
1357
if self . eat_noexpect ( & token:: Colon ) {
1356
1358
match self . parse_expr ( ) {
1357
1359
Ok ( _) => {
1358
1360
self . sess . emit_err ( TernaryOperator { span : self . token . span . with_lo ( lo) } ) ;
1361
+ return true ;
1359
1362
}
1360
1363
Err ( err) => {
1361
1364
err. cancel ( ) ;
@@ -1366,6 +1369,8 @@ impl<'a> Parser<'a> {
1366
1369
} else {
1367
1370
self . restore_snapshot ( snapshot) ;
1368
1371
} ;
1372
+
1373
+ false
1369
1374
}
1370
1375
1371
1376
pub ( super ) fn maybe_recover_from_bad_type_plus ( & mut self , ty : & Ty ) -> PResult < ' a , ( ) > {
0 commit comments