@@ -101,12 +101,19 @@ impl<'a> Parser<'a> {
101101 /// `PatternNoTopAlt` (see below) are used.
102102 pub fn parse_pat_allow_top_guard (
103103 & mut self ,
104- _expected : Option < Expected > ,
105- _rc : RecoverComma ,
106- _ra : RecoverColon ,
107- _rt : CommaRecoveryMode ,
104+ expected : Option < Expected > ,
105+ rc : RecoverComma ,
106+ ra : RecoverColon ,
107+ rt : CommaRecoveryMode ,
108108 ) -> PResult < ' a , P < Pat > > {
109- todo ! ( )
109+ let pat = self . parse_pat_no_top_guard ( expected, rc, ra, rt) ?;
110+
111+ if self . eat_keyword ( kw:: If ) {
112+ let cond = self . parse_expr ( ) ?;
113+ Ok ( self . mk_pat ( pat. span . to ( cond. span ) , PatKind :: Guard ( pat, cond) ) )
114+ } else {
115+ Ok ( pat)
116+ }
110117 }
111118
112119 /// Parses a pattern.
@@ -125,8 +132,8 @@ impl<'a> Parser<'a> {
125132 /// Parses a pattern.
126133 ///
127134 /// Corresponds to `PatternNoTopGuard` in RFC 3637 and allows or-patterns, but not
128- /// guard patterns, at the top level. Used for parsing patterns in `pat` fragments and
129- /// `let`, `if let`, and `while let` expressions.
135+ /// guard patterns, at the top level. Used for parsing patterns in `pat` fragments (until
136+ /// the next edition) and `let`, `if let`, and `while let` expressions.
130137 ///
131138 /// Note that after the FCP in <https://github.com/rust-lang/rust/issues/81415>,
132139 /// a leading vert is allowed in nested or-patterns, too. This allows us to
@@ -709,7 +716,7 @@ impl<'a> Parser<'a> {
709716 } else if self . check ( & token:: OpenDelim ( Delimiter :: Bracket ) ) {
710717 // Parse `[pat, pat,...]` as a slice pattern.
711718 let ( pats, _) = self . parse_delim_comma_seq ( Delimiter :: Bracket , |p| {
712- p. parse_pat_no_top_guard (
719+ p. parse_pat_allow_top_guard (
713720 None ,
714721 RecoverComma :: No ,
715722 RecoverColon :: No ,
@@ -957,7 +964,7 @@ impl<'a> Parser<'a> {
957964 let open_paren = self . token . span ;
958965
959966 let ( fields, trailing_comma) = self . parse_paren_comma_seq ( |p| {
960- p. parse_pat_no_top_guard (
967+ p. parse_pat_allow_top_guard (
961968 None ,
962969 RecoverComma :: No ,
963970 RecoverColon :: No ,
@@ -1372,7 +1379,7 @@ impl<'a> Parser<'a> {
13721379 path : Path ,
13731380 ) -> PResult < ' a , PatKind > {
13741381 let ( fields, _) = self . parse_paren_comma_seq ( |p| {
1375- p. parse_pat_no_top_guard (
1382+ p. parse_pat_allow_top_guard (
13761383 None ,
13771384 RecoverComma :: No ,
13781385 RecoverColon :: No ,
@@ -1407,7 +1414,7 @@ impl<'a> Parser<'a> {
14071414 self . parse_builtin ( |self_, _lo, ident| {
14081415 Ok ( match ident. name {
14091416 // builtin#deref(PAT)
1410- sym:: deref => Some ( ast:: PatKind :: Deref ( self_. parse_pat_no_top_guard (
1417+ sym:: deref => Some ( ast:: PatKind :: Deref ( self_. parse_pat_allow_top_guard (
14111418 None ,
14121419 RecoverComma :: Yes ,
14131420 RecoverColon :: Yes ,
@@ -1655,7 +1662,7 @@ impl<'a> Parser<'a> {
16551662 // Parsing a pattern of the form `fieldname: pat`.
16561663 let fieldname = self . parse_field_name ( ) ?;
16571664 self . bump ( ) ;
1658- let pat = self . parse_pat_no_top_guard (
1665+ let pat = self . parse_pat_allow_top_guard (
16591666 None ,
16601667 RecoverComma :: No ,
16611668 RecoverColon :: No ,
0 commit comments