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:
Dan Robertson 2018-05-29 01:51:36 +00:00
parent 30cae58709
commit 8f6441513e
No known key found for this signature in database
GPG key ID: A16838C8EB8330B5
3 changed files with 82 additions and 3 deletions

View file

@ -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
}
}

View 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]
} => (),
}
};
}

View 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`.