@@ -102,12 +102,19 @@ impl<'a> Parser<'a> {
102102 /// `PatternNoTopAlt` (see below) are used.
103103 pub fn parse_pat_allow_top_guard (
104104 & mut self ,
105- _expected : Option < Expected > ,
106- _rc : RecoverComma ,
107- _ra : RecoverColon ,
108- _rt : CommaRecoveryMode ,
105+ expected : Option < Expected > ,
106+ rc : RecoverComma ,
107+ ra : RecoverColon ,
108+ rt : CommaRecoveryMode ,
109109 ) -> PResult < ' a , P < Pat > > {
110- todo ! ( )
110+ let pat = self . parse_pat_no_top_guard ( expected, rc, ra, rt) ?;
111+
112+ if self . eat_keyword ( kw:: If ) {
113+ let cond = self . parse_expr ( ) ?;
114+ Ok ( self . mk_pat ( pat. span . to ( cond. span ) , PatKind :: Guard ( pat, cond) ) )
115+ } else {
116+ Ok ( pat)
117+ }
111118 }
112119
113120 /// Parses a pattern.
@@ -126,8 +133,8 @@ impl<'a> Parser<'a> {
126133 /// Parses a pattern.
127134 ///
128135 /// Corresponds to `PatternNoTopGuard` in RFC 3637 and allows or-patterns, but not
129- /// guard patterns, at the top level. Used for parsing patterns in `pat` fragments and
130- /// `let`, `if let`, and `while let` expressions.
136+ /// guard patterns, at the top level. Used for parsing patterns in `pat` fragments (until
137+ /// the next edition) and `let`, `if let`, and `while let` expressions.
131138 ///
132139 /// Note that after the FCP in <https://github.com/rust-lang/rust/issues/81415>,
133140 /// a leading vert is allowed in nested or-patterns, too. This allows us to
@@ -710,7 +717,7 @@ impl<'a> Parser<'a> {
710717 } else if self . check ( & token:: OpenDelim ( Delimiter :: Bracket ) ) {
711718 // Parse `[pat, pat,...]` as a slice pattern.
712719 let ( pats, _) = self . parse_delim_comma_seq ( Delimiter :: Bracket , |p| {
713- p. parse_pat_no_top_guard (
720+ p. parse_pat_allow_top_guard (
714721 None ,
715722 RecoverComma :: No ,
716723 RecoverColon :: No ,
@@ -958,7 +965,7 @@ impl<'a> Parser<'a> {
958965 let open_paren = self . token . span ;
959966
960967 let ( fields, trailing_comma) = self . parse_paren_comma_seq ( |p| {
961- p. parse_pat_no_top_guard (
968+ p. parse_pat_allow_top_guard (
962969 None ,
963970 RecoverComma :: No ,
964971 RecoverColon :: No ,
@@ -1373,7 +1380,7 @@ impl<'a> Parser<'a> {
13731380 path : Path ,
13741381 ) -> PResult < ' a , PatKind > {
13751382 let ( fields, _) = self . parse_paren_comma_seq ( |p| {
1376- p. parse_pat_no_top_guard (
1383+ p. parse_pat_allow_top_guard (
13771384 None ,
13781385 RecoverComma :: No ,
13791386 RecoverColon :: No ,
@@ -1408,7 +1415,7 @@ impl<'a> Parser<'a> {
14081415 self . parse_builtin ( |self_, _lo, ident| {
14091416 Ok ( match ident. name {
14101417 // builtin#deref(PAT)
1411- sym:: deref => Some ( ast:: PatKind :: Deref ( self_. parse_pat_no_top_guard (
1418+ sym:: deref => Some ( ast:: PatKind :: Deref ( self_. parse_pat_allow_top_guard (
14121419 None ,
14131420 RecoverComma :: Yes ,
14141421 RecoverColon :: Yes ,
@@ -1683,7 +1690,7 @@ impl<'a> Parser<'a> {
16831690 // Parsing a pattern of the form `fieldname: pat`.
16841691 let fieldname = self . parse_field_name ( ) ?;
16851692 self . bump ( ) ;
1686- let pat = self . parse_pat_no_top_guard (
1693+ let pat = self . parse_pat_allow_top_guard (
16871694 None ,
16881695 RecoverComma :: No ,
16891696 RecoverColon :: No ,
0 commit comments