@@ -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