typeck: Do not pass the field check on field error
If a struct pattern has a field error return an error.
This commit is contained in:
parent
30cae58709
commit
8f6441513e
3 changed files with 82 additions and 3 deletions
|
@ -720,8 +720,11 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
|
|||
self.demand_eqtype(pat.span, expected, pat_ty);
|
||||
|
||||
// Type check subpatterns.
|
||||
self.check_struct_pat_fields(pat_ty, pat.id, pat.span, variant, fields, etc, def_bm);
|
||||
pat_ty
|
||||
if self.check_struct_pat_fields(pat_ty, pat.id, pat.span, variant, fields, etc, def_bm) {
|
||||
pat_ty
|
||||
} else {
|
||||
self.tcx.types.err
|
||||
}
|
||||
}
|
||||
|
||||
fn check_pat_path(&self,
|
||||
|
@ -846,7 +849,7 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
|
|||
variant: &'tcx ty::VariantDef,
|
||||
fields: &'gcx [Spanned<hir::FieldPat>],
|
||||
etc: bool,
|
||||
def_bm: ty::BindingMode) {
|
||||
def_bm: ty::BindingMode) -> bool {
|
||||
let tcx = self.tcx;
|
||||
|
||||
let (substs, adt) = match adt_ty.sty {
|
||||
|
@ -864,6 +867,7 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
|
|||
|
||||
// Keep track of which fields have already appeared in the pattern.
|
||||
let mut used_fields = FxHashMap();
|
||||
let mut no_field_errors = true;
|
||||
|
||||
let mut inexistent_fields = vec![];
|
||||
// Typecheck each field.
|
||||
|
@ -879,6 +883,7 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
|
|||
format!("multiple uses of `{}` in pattern", field.ident))
|
||||
.span_label(*occupied.get(), format!("first use of `{}`", field.ident))
|
||||
.emit();
|
||||
no_field_errors = false;
|
||||
tcx.types.err
|
||||
}
|
||||
Vacant(vacant) => {
|
||||
|
@ -891,6 +896,7 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
|
|||
})
|
||||
.unwrap_or_else(|| {
|
||||
inexistent_fields.push((span, field.ident));
|
||||
no_field_errors = false;
|
||||
tcx.types.err
|
||||
})
|
||||
}
|
||||
|
@ -989,5 +995,6 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
|
|||
diag.emit();
|
||||
}
|
||||
}
|
||||
no_field_errors
|
||||
}
|
||||
}
|
||||
|
|
48
src/test/ui/issue-51102.rs
Normal file
48
src/test/ui/issue-51102.rs
Normal file
|
@ -0,0 +1,48 @@
|
|||
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
enum SimpleEnum {
|
||||
NoState,
|
||||
}
|
||||
|
||||
struct SimpleStruct {
|
||||
no_state_here: u64,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _ = |simple| {
|
||||
match simple {
|
||||
SimpleStruct {
|
||||
state: 0,
|
||||
//~^ struct `SimpleStruct` does not have a field named `state` [E0026]
|
||||
..
|
||||
} => (),
|
||||
}
|
||||
};
|
||||
|
||||
let _ = |simple| {
|
||||
match simple {
|
||||
SimpleStruct {
|
||||
no_state_here: 0,
|
||||
no_state_here: 1
|
||||
//~^ ERROR field `no_state_here` bound multiple times in the pattern [E0025]
|
||||
} => (),
|
||||
}
|
||||
};
|
||||
|
||||
let _ = |simple| {
|
||||
match simple {
|
||||
SimpleEnum::NoState {
|
||||
state: 0
|
||||
//~^ ERROR variant `SimpleEnum::NoState` does not have a field named `state` [E0026]
|
||||
} => (),
|
||||
}
|
||||
};
|
||||
}
|
24
src/test/ui/issue-51102.stderr
Normal file
24
src/test/ui/issue-51102.stderr
Normal file
|
@ -0,0 +1,24 @@
|
|||
error[E0026]: struct `SimpleStruct` does not have a field named `state`
|
||||
--> $DIR/issue-51102.rs:23:17
|
||||
|
|
||||
LL | state: 0,
|
||||
| ^^^^^^^^ struct `SimpleStruct` does not have this field
|
||||
|
||||
error[E0025]: field `no_state_here` bound multiple times in the pattern
|
||||
--> $DIR/issue-51102.rs:34:17
|
||||
|
|
||||
LL | no_state_here: 0,
|
||||
| ---------------- first use of `no_state_here`
|
||||
LL | no_state_here: 1
|
||||
| ^^^^^^^^^^^^^^^^ multiple uses of `no_state_here` in pattern
|
||||
|
||||
error[E0026]: variant `SimpleEnum::NoState` does not have a field named `state`
|
||||
--> $DIR/issue-51102.rs:43:17
|
||||
|
|
||||
LL | state: 0
|
||||
| ^^^^^^^^ variant `SimpleEnum::NoState` does not have this field
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors occurred: E0025, E0026.
|
||||
For more information about an error, try `rustc --explain E0025`.
|
Loading…
Add table
Reference in a new issue