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.
This commit is contained in:
@@ -1371,10 +1371,10 @@ impl<'a> Parser<'a> {
|
||||
self.bump();
|
||||
let (fields, etc) = self.parse_pat_fields().unwrap_or_else(|mut e| {
|
||||
e.span_label(path.span, "while parsing the fields for this pattern");
|
||||
e.emit();
|
||||
let guar = e.emit();
|
||||
self.recover_stmt();
|
||||
// When recovering, pretend we had `Foo { .. }`, to avoid cascading errors.
|
||||
(ThinVec::new(), PatFieldsRest::Rest)
|
||||
(ThinVec::new(), PatFieldsRest::Recovered(guar))
|
||||
});
|
||||
self.bump();
|
||||
Ok(PatKind::Struct(qself, path, fields, etc))
|
||||
|
||||
Reference in New Issue
Block a user