@@ -453,22 +453,7 @@ impl<'a> Parser<'a> {
453453 let ( span, e) = self . interpolated_or_expr_span ( e) ?;
454454 ( lo. to ( span) , self . mk_unary ( UnOp :: Not , e) )
455455 }
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) ?,
472457 token:: BinOp ( token:: Minus ) => self . parse_neg_expr ( lo) ?,
473458 token:: BinOp ( token:: Star ) => self . parse_deref_expr ( lo) ?,
474459 token:: BinOp ( token:: And ) | token:: AndAnd => self . parse_borrow_expr ( lo) ?,
@@ -481,6 +466,22 @@ impl<'a> Parser<'a> {
481466 return Ok ( self . mk_expr ( lo. to ( hi) , ex, attrs) ) ;
482467 }
483468
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+
484485 /// Parse `-expr`.
485486 fn parse_neg_expr ( & mut self , lo : Span ) -> PResult < ' a , ( Span , ExprKind ) > {
486487 self . bump ( ) ; // `-`
0 commit comments