@@ -99,12 +99,19 @@ impl<'a> Parser<'a> {
99
99
/// `PatternNoTopAlt` (see below) are used.
100
100
pub fn parse_pat_allow_top_guard (
101
101
& mut self ,
102
- _expected : Option < Expected > ,
103
- _rc : RecoverComma ,
104
- _ra : RecoverColon ,
105
- _rt : CommaRecoveryMode ,
102
+ expected : Option < Expected > ,
103
+ rc : RecoverComma ,
104
+ ra : RecoverColon ,
105
+ rt : CommaRecoveryMode ,
106
106
) -> PResult < ' a , P < Pat > > {
107
- todo ! ( )
107
+ let pat = self . parse_pat_no_top_guard ( expected, rc, ra, rt) ?;
108
+
109
+ if self . eat_keyword ( kw:: If ) {
110
+ let cond = self . parse_expr ( ) ?;
111
+ Ok ( self . mk_pat ( pat. span . to ( cond. span ) , PatKind :: Guard ( pat, cond) ) )
112
+ } else {
113
+ Ok ( pat)
114
+ }
108
115
}
109
116
110
117
/// Parses a pattern.
@@ -123,8 +130,8 @@ impl<'a> Parser<'a> {
123
130
/// Parses a pattern.
124
131
///
125
132
/// Corresponds to `PatternNoTopGuard` in RFC 3637 and allows or-patterns, but not
126
- /// guard patterns, at the top level. Used for parsing patterns in `pat` fragments and
127
- /// `let`, `if let`, and `while let` expressions.
133
+ /// guard patterns, at the top level. Used for parsing patterns in `pat` fragments (until
134
+ /// the next edition) and `let`, `if let`, and `while let` expressions.
128
135
///
129
136
/// Note that after the FCP in <https://github.com/rust-lang/rust/issues/81415>,
130
137
/// a leading vert is allowed in nested or-patterns, too. This allows us to
@@ -473,7 +480,7 @@ impl<'a> Parser<'a> {
473
480
} else if self . check ( & token:: OpenDelim ( Delimiter :: Bracket ) ) {
474
481
// Parse `[pat, pat,...]` as a slice pattern.
475
482
let ( pats, _) = self . parse_delim_comma_seq ( Delimiter :: Bracket , |p| {
476
- p. parse_pat_no_top_guard (
483
+ p. parse_pat_allow_top_guard (
477
484
None ,
478
485
RecoverComma :: No ,
479
486
RecoverColon :: No ,
@@ -721,7 +728,7 @@ impl<'a> Parser<'a> {
721
728
let open_paren = self . token . span ;
722
729
723
730
let ( fields, trailing_comma) = self . parse_paren_comma_seq ( |p| {
724
- p. parse_pat_no_top_guard (
731
+ p. parse_pat_allow_top_guard (
725
732
None ,
726
733
RecoverComma :: No ,
727
734
RecoverColon :: No ,
@@ -1130,7 +1137,7 @@ impl<'a> Parser<'a> {
1130
1137
path : Path ,
1131
1138
) -> PResult < ' a , PatKind > {
1132
1139
let ( fields, _) = self . parse_paren_comma_seq ( |p| {
1133
- p. parse_pat_no_top_guard (
1140
+ p. parse_pat_allow_top_guard (
1134
1141
None ,
1135
1142
RecoverComma :: No ,
1136
1143
RecoverColon :: No ,
@@ -1165,7 +1172,7 @@ impl<'a> Parser<'a> {
1165
1172
self . parse_builtin ( |self_, _lo, ident| {
1166
1173
Ok ( match ident. name {
1167
1174
// builtin#deref(PAT)
1168
- sym:: deref => Some ( ast:: PatKind :: Deref ( self_. parse_pat_no_top_guard (
1175
+ sym:: deref => Some ( ast:: PatKind :: Deref ( self_. parse_pat_allow_top_guard (
1169
1176
None ,
1170
1177
RecoverComma :: Yes ,
1171
1178
RecoverColon :: Yes ,
@@ -1415,7 +1422,7 @@ impl<'a> Parser<'a> {
1415
1422
// Parsing a pattern of the form `fieldname: pat`.
1416
1423
let fieldname = self . parse_field_name ( ) ?;
1417
1424
self . bump ( ) ;
1418
- let pat = self . parse_pat_no_top_guard (
1425
+ let pat = self . parse_pat_allow_top_guard (
1419
1426
None ,
1420
1427
RecoverComma :: No ,
1421
1428
RecoverColon :: No ,
0 commit comments