@@ -109,18 +109,7 @@ impl<'a> Parser<'a> {
109
109
110
110
let lo = self . token . span ;
111
111
let pat = match self . token . kind {
112
- token:: BinOp ( token:: And ) | token:: AndAnd => {
113
- // Parse &pat / &mut pat
114
- self . expect_and ( ) ?;
115
- let mutbl = self . parse_mutability ( ) ;
116
- if let token:: Lifetime ( name) = self . token . kind {
117
- let mut err = self . fatal ( & format ! ( "unexpected lifetime `{}` in pattern" , name) ) ;
118
- err. span_label ( self . token . span , "unexpected lifetime" ) ;
119
- return Err ( err) ;
120
- }
121
- let subpat = self . parse_pat_with_range_pat ( false , expected) ?;
122
- PatKind :: Ref ( subpat, mutbl)
123
- }
112
+ token:: BinOp ( token:: And ) | token:: AndAnd => self . parse_pat_deref ( expected) ?,
124
113
token:: OpenDelim ( token:: Paren ) => {
125
114
// Parse a tuple or parenthesis pattern.
126
115
let ( fields, trailing_comma) = self . parse_paren_comma_seq ( |p| p. parse_pat ( None ) ) ?;
@@ -332,6 +321,21 @@ impl<'a> Parser<'a> {
332
321
Ok ( pat)
333
322
}
334
323
324
+ /// Parse `&pat` / `&mut pat`.
325
+ fn parse_pat_deref ( & mut self , expected : Option < & ' static str > ) -> PResult < ' a , PatKind > {
326
+ self . expect_and ( ) ?;
327
+ let mutbl = self . parse_mutability ( ) ;
328
+
329
+ if let token:: Lifetime ( name) = self . token . kind {
330
+ let mut err = self . fatal ( & format ! ( "unexpected lifetime `{}` in pattern" , name) ) ;
331
+ err. span_label ( self . token . span , "unexpected lifetime" ) ;
332
+ return Err ( err) ;
333
+ }
334
+
335
+ let subpat = self . parse_pat_with_range_pat ( false , expected) ?;
336
+ Ok ( PatKind :: Ref ( subpat, mutbl) )
337
+ }
338
+
335
339
// Helper function to decide whether to parse as ident binding
336
340
// or to try to do something more complex like range patterns.
337
341
fn parse_as_ident ( & mut self ) -> bool {
0 commit comments