diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2024-12-13 21:51:33 +0000 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2024-12-13 21:51:33 +0000 |
| commit | 0f82cfffda97be546949f974586d007b51e2b36e (patch) | |
| tree | 27e78cf27fae3181e422197ba0f1770be4a0d0aa /compiler/rustc_ast_lowering/src/pat.rs | |
| parent | 21fe748be15271ea5804e0507cd699b675efe038 (diff) | |
| download | rust-0f82cfffda97be546949f974586d007b51e2b36e.tar.gz rust-0f82cfffda97be546949f974586d007b51e2b36e.zip | |
Keep track of patterns that could have introduced a binding, but didn't
When we recover from a pattern parse error, or a pattern uses `..`, we keep track of that and affect resolution error for missing bindings that could have been provided by that pattern. We differentiate between `..` and parse recovery. We silence resolution errors likely caused by the pattern parse error.
```
error[E0425]: cannot find value `title` in this scope
--> $DIR/struct-pattern-with-missing-fields-resolve-error.rs:19:30
|
LL | println!("[{}]({})", title, url);
| ^^^^^ not found in this scope
|
note: `Website` has a field `title` which could have been included in this pattern, but it wasn't
--> $DIR/struct-pattern-with-missing-fields-resolve-error.rs:17:12
|
LL | / struct Website {
LL | | url: String,
LL | | title: Option<String> ,
| | ----- defined here
LL | | }
| |_-
...
LL | if let Website { url, .. } = website {
| ^^^^^^^^^^^^^^^^^^^ this pattern doesn't include `title`, which is available in `Website`
```
Fix #74863.
Diffstat (limited to 'compiler/rustc_ast_lowering/src/pat.rs')
| -rw-r--r-- | compiler/rustc_ast_lowering/src/pat.rs | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/compiler/rustc_ast_lowering/src/pat.rs b/compiler/rustc_ast_lowering/src/pat.rs index c4bae084a3f..60660548590 100644 --- a/compiler/rustc_ast_lowering/src/pat.rs +++ b/compiler/rustc_ast_lowering/src/pat.rs @@ -92,7 +92,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { span: self.lower_span(f.span), } })); - break hir::PatKind::Struct(qpath, fs, *etc == ast::PatFieldsRest::Rest); + break hir::PatKind::Struct( + qpath, + fs, + matches!( + etc, + ast::PatFieldsRest::Rest | ast::PatFieldsRest::Recovered(_) + ), + ); } PatKind::Tuple(pats) => { let (pats, ddpos) = self.lower_pat_tuple(pats, "tuple"); |
