Skip to content

Commit

Permalink
Fix handling of struct variants in a couple of places
Browse files Browse the repository at this point in the history
Fixes #17405.
Fixes #17518.
Fixes #17800.
  • Loading branch information
Jakub Wieczorek committed Oct 5, 2014
1 parent c586490 commit b9896cb
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 14 deletions.
8 changes: 3 additions & 5 deletions src/librustc/diagnostics.rs
Expand Up @@ -38,7 +38,6 @@ register_diagnostics!(
E0017,
E0019,
E0020,
E0021,
E0022,
E0023,
E0024,
Expand All @@ -62,7 +61,6 @@ register_diagnostics!(
E0045,
E0046,
E0047,
E0048,
E0049,
E0050,
E0051,
Expand Down Expand Up @@ -117,8 +115,6 @@ register_diagnostics!(
E0109,
E0110,
E0113,
E0114,
E0115,
E0116,
E0117,
E0118,
Expand Down Expand Up @@ -152,5 +148,7 @@ register_diagnostics!(
E0158,
E0159,
E0161,
E0162
E0162,
E0163,
E0164
)
31 changes: 24 additions & 7 deletions src/librustc/middle/typeck/check/_match.rs
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/middle/typeck/check/mod.rs
Expand Up @@ -4330,7 +4330,7 @@ fn check_expr_with_unifier(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
Expand Down
2 changes: 1 addition & 1 deletion src/test/compile-fail/issue-15896.rs
Expand Up @@ -18,7 +18,7 @@ fn main() {
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 changes: 19 additions & 0 deletions src/test/compile-fail/issue-17405.rs
@@ -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 changes: 17 additions & 0 deletions src/test/compile-fail/issue-17518.rs
@@ -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 changes: 21 additions & 0 deletions src/test/compile-fail/issue-17800.rs
@@ -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
_ => (),
}
}

9 comments on commit b9896cb

@bors
Copy link
Contributor

@bors bors commented on b9896cb Oct 6, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bors
Copy link
Contributor

@bors bors commented on b9896cb Oct 6, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging jakub-/rust/issue-17405 = b9896cb into auto

@bors
Copy link
Contributor

@bors bors commented on b9896cb Oct 6, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jakub-/rust/issue-17405 = b9896cb merged ok, testing candidate = 26d9a6f4

@bors
Copy link
Contributor

@bors bors commented on b9896cb Oct 6, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bors
Copy link
Contributor

@bors bors commented on b9896cb Oct 6, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging jakub-/rust/issue-17405 = b9896cb into auto

@bors
Copy link
Contributor

@bors bors commented on b9896cb Oct 6, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jakub-/rust/issue-17405 = b9896cb merged ok, testing candidate = f50b56c

@bors
Copy link
Contributor

@bors bors commented on b9896cb Oct 6, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bors
Copy link
Contributor

@bors bors commented on b9896cb Oct 6, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast-forwarding master to auto = f50b56c

Please sign in to comment.