@@ -99,12 +99,19 @@ impl<'a> Parser<'a> {
9999 /// `PatternNoTopAlt` (see below) are used.
100100 pub fn parse_pat_allow_top_guard (
101101 & 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 ,
106106 ) -> 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+ }
108115 }
109116
110117 /// Parses a pattern.
@@ -123,8 +130,8 @@ impl<'a> Parser<'a> {
123130 /// Parses a pattern.
124131 ///
125132 /// 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.
128135 ///
129136 /// Note that after the FCP in <https://github.com/rust-lang/rust/issues/81415>,
130137 /// a leading vert is allowed in nested or-patterns, too. This allows us to
@@ -477,7 +484,7 @@ impl<'a> Parser<'a> {
477484 } else if self . check ( & token:: OpenDelim ( Delimiter :: Bracket ) ) {
478485 // Parse `[pat, pat,...]` as a slice pattern.
479486 let ( pats, _) = self . parse_delim_comma_seq ( Delimiter :: Bracket , |p| {
480- p. parse_pat_no_top_guard (
487+ p. parse_pat_allow_top_guard (
481488 None ,
482489 RecoverComma :: No ,
483490 RecoverColon :: No ,
@@ -725,7 +732,7 @@ impl<'a> Parser<'a> {
725732 let open_paren = self . token . span ;
726733
727734 let ( fields, trailing_comma) = self . parse_paren_comma_seq ( |p| {
728- p. parse_pat_no_top_guard (
735+ p. parse_pat_allow_top_guard (
729736 None ,
730737 RecoverComma :: No ,
731738 RecoverColon :: No ,
@@ -1134,7 +1141,7 @@ impl<'a> Parser<'a> {
11341141 path : Path ,
11351142 ) -> PResult < ' a , PatKind > {
11361143 let ( fields, _) = self . parse_paren_comma_seq ( |p| {
1137- p. parse_pat_no_top_guard (
1144+ p. parse_pat_allow_top_guard (
11381145 None ,
11391146 RecoverComma :: No ,
11401147 RecoverColon :: No ,
@@ -1169,7 +1176,7 @@ impl<'a> Parser<'a> {
11691176 self . parse_builtin ( |self_, _lo, ident| {
11701177 Ok ( match ident. name {
11711178 // builtin#deref(PAT)
1172- sym:: deref => Some ( ast:: PatKind :: Deref ( self_. parse_pat_no_top_guard (
1179+ sym:: deref => Some ( ast:: PatKind :: Deref ( self_. parse_pat_allow_top_guard (
11731180 None ,
11741181 RecoverComma :: Yes ,
11751182 RecoverColon :: Yes ,
@@ -1417,7 +1424,7 @@ impl<'a> Parser<'a> {
14171424 // Parsing a pattern of the form `fieldname: pat`.
14181425 let fieldname = self . parse_field_name ( ) ?;
14191426 self . bump ( ) ;
1420- let pat = self . parse_pat_no_top_guard (
1427+ let pat = self . parse_pat_allow_top_guard (
14211428 None ,
14221429 RecoverComma :: No ,
14231430 RecoverColon :: No ,
0 commit comments