Skip to content

Commit da7f411

Browse files
committed
Fix bug in match checking
When `specialize`ing struct-like enum patterns, compare struct fields to pattern fields, not pattern fields to pattern fields. Closes #8351.
1 parent 822699e commit da7f411

File tree

1 file changed

+5
-6
lines changed

1 file changed

+5
-6
lines changed

src/librustc/middle/check_match.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -662,15 +662,14 @@ fn specialize(cx: &MatchCheckCtxt,
662662
_ => None
663663
}
664664
}
665-
PatStruct(_, ref flds, _) => {
665+
PatStruct(_, ref pattern_fields, _) => {
666666
// Is this a struct or an enum variant?
667667
match cx.tcx.def_map.get_copy(&pat_id) {
668668
DefVariant(_, variant_id, _) => {
669669
if variant(variant_id) == *ctor_id {
670-
// FIXME #4731: Is this right? --pcw
671-
let args = flds.map(|ty_field| {
672-
match flds.iter().find(|f|
673-
f.ident == ty_field.ident) {
670+
let struct_fields = ty::lookup_struct_fields(cx.tcx, variant_id);
671+
let args = struct_fields.map(|sf| {
672+
match pattern_fields.iter().find(|f| f.ident.name == sf.name) {
674673
Some(f) => f.pat,
675674
_ => wild()
676675
}
@@ -700,7 +699,7 @@ fn specialize(cx: &MatchCheckCtxt,
700699
}
701700
}
702701
let args = class_fields.iter().map(|class_field| {
703-
match flds.iter().find(|f|
702+
match pattern_fields.iter().find(|f|
704703
f.ident.name == class_field.name) {
705704
Some(f) => f.pat,
706705
_ => wild()

0 commit comments

Comments
 (0)