@@ -481,7 +481,7 @@ impl<'a> Parser<'a> {
481481 let ( span, e) = self . interpolated_or_expr_span ( e) ?;
482482 ( lo. to ( span) , self . mk_unary ( UnOp :: Deref , e) )
483483 }
484- token:: BinOp ( token:: And ) | token:: AndAnd => self . parse_address_of ( lo) ?,
484+ token:: BinOp ( token:: And ) | token:: AndAnd => self . parse_borrow_expr ( lo) ?,
485485 token:: Ident ( ..) if self . token . is_keyword ( kw:: Box ) => {
486486 self . bump ( ) ;
487487 let e = self . parse_prefix_expr ( None ) ;
@@ -637,20 +637,27 @@ impl<'a> Parser<'a> {
637637 }
638638
639639 /// Parse `& mut? <expr>` or `& raw [ const | mut ] <expr>`.
640- fn parse_address_of ( & mut self , lo : Span ) -> PResult < ' a , ( Span , ExprKind ) > {
640+ fn parse_borrow_expr ( & mut self , lo : Span ) -> PResult < ' a , ( Span , ExprKind ) > {
641641 self . expect_and ( ) ?;
642- let ( k, m) = if self . check_keyword ( kw:: Raw ) && self . look_ahead ( 1 , Token :: is_mutability) {
642+ let ( borrow_kind, mutbl) = self . parse_borrow_modifiers ( lo) ;
643+ let expr = self . parse_prefix_expr ( None ) ;
644+ let ( span, expr) = self . interpolated_or_expr_span ( expr) ?;
645+ Ok ( ( lo. to ( span) , ExprKind :: AddrOf ( borrow_kind, mutbl, expr) ) )
646+ }
647+
648+ /// Parse `mut?` or `raw [ const | mut ]`.
649+ fn parse_borrow_modifiers ( & mut self , lo : Span ) -> ( ast:: BorrowKind , ast:: Mutability ) {
650+ if self . check_keyword ( kw:: Raw ) && self . look_ahead ( 1 , Token :: is_mutability) {
651+ // `raw [ const | mut ]`.
643652 let found_raw = self . eat_keyword ( kw:: Raw ) ;
644653 assert ! ( found_raw) ;
645654 let mutability = self . parse_const_or_mut ( ) . unwrap ( ) ;
646655 self . sess . gated_spans . gate ( sym:: raw_ref_op, lo. to ( self . prev_span ) ) ;
647656 ( ast:: BorrowKind :: Raw , mutability)
648657 } else {
658+ // `mut?`
649659 ( ast:: BorrowKind :: Ref , self . parse_mutability ( ) )
650- } ;
651- let e = self . parse_prefix_expr ( None ) ;
652- let ( span, e) = self . interpolated_or_expr_span ( e) ?;
653- Ok ( ( lo. to ( span) , ExprKind :: AddrOf ( k, m, e) ) )
660+ }
654661 }
655662
656663 /// Parses `a.b` or `a(13)` or `a[4]` or just `a`.
0 commit comments