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:
parent
21fe748be1
commit
0f82cfffda
8 changed files with 158 additions and 7 deletions
|
@ -0,0 +1,22 @@
|
|||
struct Website {
|
||||
url: String,
|
||||
title: Option<String> ,//~ NOTE defined here
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let website = Website {
|
||||
url: "http://www.example.com".into(),
|
||||
title: Some("Example Domain".into()),
|
||||
};
|
||||
|
||||
if let Website { url, Some(title) } = website { //~ ERROR expected `,`
|
||||
//~^ NOTE while parsing the fields for this pattern
|
||||
println!("[{}]({})", title, url); // we hide the errors for `title` and `url`
|
||||
}
|
||||
|
||||
if let Website { url, .. } = website { //~ NOTE `Website` has a field `title`
|
||||
//~^ NOTE this pattern
|
||||
println!("[{}]({})", title, url); //~ ERROR cannot find value `title` in this scope
|
||||
//~^ NOTE not found in this scope
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
error: expected `,`
|
||||
--> $DIR/struct-pattern-with-missing-fields-resolve-error.rs:12:31
|
||||
|
|
||||
LL | if let Website { url, Some(title) } = website {
|
||||
| ------- ^
|
||||
| |
|
||||
| while parsing the fields for this pattern
|
||||
|
||||
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`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0425`.
|
Loading…
Add table
Add a link
Reference in a new issue