@@ -57,12 +57,12 @@ impl<'a> Parser<'a> {
57
57
/// to subpatterns within such).
58
58
pub ( super ) fn parse_top_level_pat ( & mut self ) -> PResult < ' a , P < Pat > > {
59
59
let pat = self . parse_pat ( None ) ?;
60
- self . maybe_recover_unexpected_comma ( pat. span ) ?;
60
+ self . maybe_recover_unexpected_comma ( pat. span , true ) ?;
61
61
Ok ( pat)
62
62
}
63
63
64
- fn maybe_recover_unexpected_comma ( & mut self , lo : Span ) -> PResult < ' a , ( ) > {
65
- if self . token != token:: Comma {
64
+ fn maybe_recover_unexpected_comma ( & mut self , lo : Span , top_level : bool ) -> PResult < ' a , ( ) > {
65
+ if !top_level || self . token != token:: Comma {
66
66
return Ok ( ( ) ) ;
67
67
}
68
68
@@ -109,9 +109,15 @@ impl<'a> Parser<'a> {
109
109
}
110
110
111
111
/// Parses a pattern, that may be a or-pattern (e.g. `Some(Foo | Bar)`).
112
- fn parse_pat_with_or ( & mut self , expected : Expected , gate_or : bool ) -> PResult < ' a , P < Pat > > {
112
+ fn parse_pat_with_or (
113
+ & mut self ,
114
+ expected : Expected ,
115
+ gate_or : bool ,
116
+ top_level : bool
117
+ ) -> PResult < ' a , P < Pat > > {
113
118
// Parse the first pattern.
114
119
let first_pat = self . parse_pat ( expected) ?;
120
+ self . maybe_recover_unexpected_comma ( first_pat. span , top_level) ?;
115
121
116
122
// If the next token is not a `|`,
117
123
// this is not an or-pattern and we should exit here.
@@ -132,7 +138,9 @@ impl<'a> Parser<'a> {
132
138
break ;
133
139
}
134
140
135
- pats. push ( self . parse_pat ( expected) ?) ;
141
+ let pat = self . parse_pat ( expected) ?;
142
+ self . maybe_recover_unexpected_comma ( pat. span , top_level) ?;
143
+ pats. push ( pat) ;
136
144
}
137
145
let or_pattern_span = lo. to ( self . prev_span ) ;
138
146
@@ -162,7 +170,7 @@ impl<'a> Parser<'a> {
162
170
// Parse `[pat, pat,...]` as a slice pattern.
163
171
let ( pats, _) = self . parse_delim_comma_seq (
164
172
token:: Bracket ,
165
- |p| p. parse_pat_with_or ( None , true ) ,
173
+ |p| p. parse_pat_with_or ( None , true , false ) ,
166
174
) ?;
167
175
PatKind :: Slice ( pats)
168
176
}
@@ -292,7 +300,7 @@ impl<'a> Parser<'a> {
292
300
/// Parse a tuple or parenthesis pattern.
293
301
fn parse_pat_tuple_or_parens ( & mut self ) -> PResult < ' a , PatKind > {
294
302
let ( fields, trailing_comma) = self . parse_paren_comma_seq ( |p| {
295
- p. parse_pat_with_or ( None , true )
303
+ p. parse_pat_with_or ( None , true , false )
296
304
} ) ?;
297
305
298
306
// Here, `(pat,)` is a tuple pattern.
@@ -536,7 +544,7 @@ impl<'a> Parser<'a> {
536
544
err. span_label ( self . token . span , msg) ;
537
545
return Err ( err) ;
538
546
}
539
- let ( fields, _) = self . parse_paren_comma_seq ( |p| p. parse_pat_with_or ( None , true ) ) ?;
547
+ let ( fields, _) = self . parse_paren_comma_seq ( |p| p. parse_pat_with_or ( None , true , false ) ) ?;
540
548
Ok ( PatKind :: TupleStruct ( path, fields) )
541
549
}
542
550
@@ -680,7 +688,7 @@ impl<'a> Parser<'a> {
680
688
// Parsing a pattern of the form "fieldname: pat"
681
689
let fieldname = self . parse_field_name ( ) ?;
682
690
self . bump ( ) ;
683
- let pat = self . parse_pat_with_or ( None , true ) ?;
691
+ let pat = self . parse_pat_with_or ( None , true , false ) ?;
684
692
hi = pat. span ;
685
693
( pat, fieldname, false )
686
694
} else {
0 commit comments