diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-03-21 17:46:50 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-21 17:46:50 +0100 |
| commit | 9cd11c4335ead5fa4221ba003925211e9a3b58fa (patch) | |
| tree | e8db3664d1194ba28c2305cc0a1ef8586f396312 /compiler/rustc_parse/src | |
| parent | 7938ce6677b2f5ad95aa5d2a3383f0667a6ad628 (diff) | |
| parent | a4db3ffdcbce5e43c1ba47277719fecd0dd53b63 (diff) | |
| download | rust-9cd11c4335ead5fa4221ba003925211e9a3b58fa.tar.gz rust-9cd11c4335ead5fa4221ba003925211e9a3b58fa.zip | |
Rollup merge of #122793 - compiler-errors:deref-pat-syntax, r=Nadrieril
Implement macro-based deref!() syntax for deref patterns Stop using `box PAT` syntax for deref patterns, and instead use a perma-unstable macro. Blocked on #122222 r? `@Nadrieril`
Diffstat (limited to 'compiler/rustc_parse/src')
| -rw-r--r-- | compiler/rustc_parse/src/parser/pat.rs | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/compiler/rustc_parse/src/parser/pat.rs b/compiler/rustc_parse/src/parser/pat.rs index cb8d0a89d17..fbc28859535 100644 --- a/compiler/rustc_parse/src/parser/pat.rs +++ b/compiler/rustc_parse/src/parser/pat.rs @@ -498,11 +498,14 @@ impl<'a> Parser<'a> { } else { PatKind::Lit(const_expr) } + } else if self.is_builtin() { + self.parse_pat_builtin()? + } // Don't eagerly error on semantically invalid tokens when matching // declarative macros, as the input to those doesn't have to be // semantically valid. For attribute/derive proc macros this is not the // case, so doing the recovery for them is fine. - } else if self.can_be_ident_pat() + else if self.can_be_ident_pat() || (self.is_lit_bad_ident().is_some() && self.may_recover()) { // Parse `ident @ pat` @@ -1119,6 +1122,21 @@ impl<'a> Parser<'a> { .contains(&self.token.kind) } + fn parse_pat_builtin(&mut self) -> PResult<'a, PatKind> { + self.parse_builtin(|self_, _lo, ident| { + Ok(match ident.name { + // builtin#deref(PAT) + sym::deref => Some(ast::PatKind::Deref(self_.parse_pat_allow_top_alt( + None, + RecoverComma::Yes, + RecoverColon::Yes, + CommaRecoveryMode::LikelyTuple, + )?)), + _ => None, + }) + }) + } + /// Parses `box pat` fn parse_pat_box(&mut self) -> PResult<'a, PatKind> { let box_span = self.prev_token.span; |
