@@ -481,7 +481,7 @@ impl<'a> Parser<'a> {
481
481
let ( span, e) = self . interpolated_or_expr_span ( e) ?;
482
482
( lo. to ( span) , self . mk_unary ( UnOp :: Deref , e) )
483
483
}
484
- token:: BinOp ( token:: And ) | token:: AndAnd => self . parse_address_of ( lo) ?,
484
+ token:: BinOp ( token:: And ) | token:: AndAnd => self . parse_borrow_expr ( lo) ?,
485
485
token:: Ident ( ..) if self . token . is_keyword ( kw:: Box ) => {
486
486
self . bump ( ) ;
487
487
let e = self . parse_prefix_expr ( None ) ;
@@ -637,20 +637,27 @@ impl<'a> Parser<'a> {
637
637
}
638
638
639
639
/// 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 ) > {
641
641
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 ]`.
643
652
let found_raw = self . eat_keyword ( kw:: Raw ) ;
644
653
assert ! ( found_raw) ;
645
654
let mutability = self . parse_const_or_mut ( ) . unwrap ( ) ;
646
655
self . sess . gated_spans . gate ( sym:: raw_ref_op, lo. to ( self . prev_span ) ) ;
647
656
( ast:: BorrowKind :: Raw , mutability)
648
657
} else {
658
+ // `mut?`
649
659
( 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
+ }
654
661
}
655
662
656
663
/// Parses `a.b` or `a(13)` or `a[4]` or just `a`.
0 commit comments