Fix handling of struct variants in a couple of places
Fixes #17405. Fixes #17518. Fixes #17800.
This commit is contained in:
parent
c586490715
commit
b9896cbf6e
@ -38,7 +38,6 @@
|
||||
E0017,
|
||||
E0019,
|
||||
E0020,
|
||||
E0021,
|
||||
E0022,
|
||||
E0023,
|
||||
E0024,
|
||||
@ -62,7 +61,6 @@
|
||||
E0045,
|
||||
E0046,
|
||||
E0047,
|
||||
E0048,
|
||||
E0049,
|
||||
E0050,
|
||||
E0051,
|
||||
@ -117,8 +115,6 @@
|
||||
E0109,
|
||||
E0110,
|
||||
E0113,
|
||||
E0114,
|
||||
E0115,
|
||||
E0116,
|
||||
E0117,
|
||||
E0118,
|
||||
@ -152,5 +148,7 @@
|
||||
E0158,
|
||||
E0159,
|
||||
E0161,
|
||||
E0162
|
||||
E0162,
|
||||
E0163,
|
||||
E0164
|
||||
)
|
||||
|
@ -382,26 +382,43 @@ pub fn check_struct_like_enum_variant_pat(pcx: &pat_ctxt,
|
||||
|
||||
// Find the variant that was specified.
|
||||
match tcx.def_map.borrow().find(&pat_id) {
|
||||
Some(&def::DefVariant(found_enum_id, variant_id, _))
|
||||
Some(&def::DefVariant(found_enum_id, variant_id, true))
|
||||
if found_enum_id == enum_id => {
|
||||
// Get the struct fields from this struct-like enum variant.
|
||||
let class_fields = ty::lookup_struct_fields(tcx, variant_id);
|
||||
|
||||
check_struct_pat_fields(pcx, span, fields, class_fields,
|
||||
let struct_fields = ty::lookup_struct_fields(tcx, variant_id);
|
||||
check_struct_pat_fields(pcx, span, fields, struct_fields,
|
||||
variant_id, substitutions, etc);
|
||||
fcx.write_ty(pat_id, expected);
|
||||
}
|
||||
Some(&def::DefVariant(_, _, false)) => {
|
||||
let name = pprust::path_to_string(path);
|
||||
span_err!(tcx.sess, span, E0163,
|
||||
"`{}` does not name a struct variant", name);
|
||||
fcx.write_error(pat_id);
|
||||
}
|
||||
Some(&def::DefVariant(_, _, true)) => {
|
||||
let name = pprust::path_to_string(path);
|
||||
span_err!(tcx.sess, span, E0164,
|
||||
"`{}` does not name a variant of the type being matched against", name);
|
||||
fcx.write_error(pat_id);
|
||||
}
|
||||
Some(&def::DefStruct(..)) |
|
||||
Some(&def::DefVariant(..)) |
|
||||
Some(&def::DefTy(..)) => {
|
||||
let name = pprust::path_to_string(path);
|
||||
span_err!(tcx.sess, span, E0028,
|
||||
"mismatched types: expected `{}`, found `{}`",
|
||||
fcx.infcx().ty_to_string(expected), name);
|
||||
"`{}` does not name a variant", name);
|
||||
fcx.write_error(pat_id);
|
||||
}
|
||||
_ => {
|
||||
tcx.sess.span_bug(span, "resolve didn't write in variant");
|
||||
}
|
||||
}
|
||||
|
||||
if ty::type_is_error(fcx.node_ty(pat_id)) {
|
||||
for field in fields.iter() {
|
||||
check_pat(pcx, &*field.pat, ty::mk_err());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Pattern checking is top-down rather than bottom-up so that bindings get
|
||||
|
@ -4330,7 +4330,7 @@ fn check_struct_fields_on_error(fcx: &FnCtxt,
|
||||
// Resolve the path.
|
||||
let def = tcx.def_map.borrow().find(&id).map(|i| *i);
|
||||
let struct_id = match def {
|
||||
Some(def::DefVariant(enum_id, variant_id, _)) => {
|
||||
Some(def::DefVariant(enum_id, variant_id, true)) => {
|
||||
check_struct_enum_variant(fcx, id, expr.span, enum_id,
|
||||
variant_id, fields.as_slice());
|
||||
enum_id
|
||||
|
@ -18,7 +18,7 @@ enum E { B(R, Tau) }
|
||||
let e = B(REB(()), Tau { t: 3 });
|
||||
let u = match e {
|
||||
B(
|
||||
Tau{t: x}, //~ ERROR mismatched types
|
||||
Tau{t: x}, //~ ERROR `Tau` does not name a variant
|
||||
_) => x,
|
||||
};
|
||||
}
|
||||
|
19
src/test/compile-fail/issue-17405.rs
Normal file
19
src/test/compile-fail/issue-17405.rs
Normal file
@ -0,0 +1,19 @@
|
||||
// Copyright 2014 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 Foo {
|
||||
Bar(int)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
match Bar(1i) {
|
||||
Foo { i } => () //~ ERROR `Foo` does not name a variant
|
||||
}
|
||||
}
|
17
src/test/compile-fail/issue-17518.rs
Normal file
17
src/test/compile-fail/issue-17518.rs
Normal file
@ -0,0 +1,17 @@
|
||||
// Copyright 2014 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 SomeEnum {
|
||||
E
|
||||
}
|
||||
|
||||
fn main() {
|
||||
E { name: "foobar" }; //~ ERROR `E` does not name a structure
|
||||
}
|
21
src/test/compile-fail/issue-17800.rs
Normal file
21
src/test/compile-fail/issue-17800.rs
Normal file
@ -0,0 +1,21 @@
|
||||
// Copyright 2014 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 MyOption<T> {
|
||||
MySome(T),
|
||||
MyNone,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
match MySome(42i) {
|
||||
MySome { x: 42i } => (), //~ ERROR `MySome` does not name a struct variant
|
||||
_ => (),
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user