Rollup merge of #95238 - TaKO8Ki:stop-emitting-E0026-for-struct-enum-with-underscore, r=estebank

Stop emitting E0026 for struct enums with underscores

This patch resolves a part of #83263;

r? `@estebank`
This commit is contained in:
Matthias Krüger 2022-03-23 22:13:26 +01:00 committed by GitHub
commit fab7a6a9fd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 2 deletions

View file

@ -17,7 +17,7 @@
use rustc_span::hygiene::DesugaringKind;
use rustc_span::lev_distance::find_best_match_for_name;
use rustc_span::source_map::{Span, Spanned};
use rustc_span::symbol::{sym, Ident};
use rustc_span::symbol::{kw, sym, Ident};
use rustc_span::{BytePos, MultiSpan, DUMMY_SP};
use rustc_trait_selection::autoderef::Autoderef;
use rustc_trait_selection::traits::{ObligationCause, Pattern};
@ -1275,7 +1275,9 @@ fn check_struct_pat_fields(
.filter(|(_, ident)| !used_fields.contains_key(ident))
.collect::<Vec<_>>();
let inexistent_fields_err = if !(inexistent_fields.is_empty() || variant.is_recovered()) {
let inexistent_fields_err = if !(inexistent_fields.is_empty() || variant.is_recovered())
&& !inexistent_fields.iter().any(|field| field.name == kw::Underscore)
{
Some(self.error_inexistent_fields(
adt.variant_descr(),
&inexistent_fields,

View file

@ -0,0 +1,12 @@
enum Foo {
Bar { bar: bool },
Other,
}
fn main() {
let foo = Some(Foo::Other);
if let Some(Foo::Bar {_}) = foo {}
//~^ ERROR expected identifier, found reserved identifier `_`
//~| ERROR pattern does not mention field `bar` [E0027]
}

View file

@ -0,0 +1,24 @@
error: expected identifier, found reserved identifier `_`
--> $DIR/struct-enum-ignoring-field-with-underscore.rs:9:27
|
LL | if let Some(Foo::Bar {_}) = foo {}
| ^ expected identifier, found reserved identifier
error[E0027]: pattern does not mention field `bar`
--> $DIR/struct-enum-ignoring-field-with-underscore.rs:9:17
|
LL | if let Some(Foo::Bar {_}) = foo {}
| ^^^^^^^^^^^^ missing field `bar`
|
help: include the missing field in the pattern
|
LL | if let Some(Foo::Bar {_, bar }) = foo {}
| ~~~~~~~
help: if you don't care about this missing field, you can explicitly ignore it
|
LL | if let Some(Foo::Bar {_, .. }) = foo {}
| ~~~~~~
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0027`.