@@ -453,22 +453,7 @@ impl<'a> Parser<'a> {
453
453
let ( span, e) = self . interpolated_or_expr_span ( e) ?;
454
454
( lo. to ( span) , self . mk_unary ( UnOp :: Not , e) )
455
455
}
456
- // Suggest `!` for bitwise negation when encountering a `~`
457
- token:: Tilde => {
458
- self . bump ( ) ;
459
- let e = self . parse_prefix_expr ( None ) ;
460
- let ( span, e) = self . interpolated_or_expr_span ( e) ?;
461
- let span_of_tilde = lo;
462
- self . struct_span_err ( span_of_tilde, "`~` cannot be used as a unary operator" )
463
- . span_suggestion_short (
464
- span_of_tilde,
465
- "use `!` to perform bitwise not" ,
466
- "!" . to_owned ( ) ,
467
- Applicability :: MachineApplicable ,
468
- )
469
- . emit ( ) ;
470
- ( lo. to ( span) , self . mk_unary ( UnOp :: Not , e) )
471
- }
456
+ token:: Tilde => self . recover_tilde_expr ( lo) ?,
472
457
token:: BinOp ( token:: Minus ) => self . parse_neg_expr ( lo) ?,
473
458
token:: BinOp ( token:: Star ) => self . parse_deref_expr ( lo) ?,
474
459
token:: BinOp ( token:: And ) | token:: AndAnd => self . parse_borrow_expr ( lo) ?,
@@ -481,6 +466,22 @@ impl<'a> Parser<'a> {
481
466
return Ok ( self . mk_expr ( lo. to ( hi) , ex, attrs) ) ;
482
467
}
483
468
469
+ // Recover on `!` suggesting for bitwise negation instead.
470
+ fn recover_tilde_expr ( & mut self , lo : Span ) -> PResult < ' a , ( Span , ExprKind ) > {
471
+ self . bump ( ) ;
472
+ let expr = self . parse_prefix_expr ( None ) ;
473
+ let ( span, expr) = self . interpolated_or_expr_span ( expr) ?;
474
+ self . struct_span_err ( lo, "`~` cannot be used as a unary operator" )
475
+ . span_suggestion_short (
476
+ lo,
477
+ "use `!` to perform bitwise not" ,
478
+ "!" . to_owned ( ) ,
479
+ Applicability :: MachineApplicable ,
480
+ )
481
+ . emit ( ) ;
482
+ Ok ( ( lo. to ( span) , self . mk_unary ( UnOp :: Not , expr) ) )
483
+ }
484
+
484
485
/// Parse `-expr`.
485
486
fn parse_neg_expr ( & mut self , lo : Span ) -> PResult < ' a , ( Span , ExprKind ) > {
486
487
self . bump ( ) ; // `-`
0 commit comments