Fix ICE when a struct variant enum contains multiple fields

Fixes the second case of #19340.
This commit is contained in:
Barosl Lee 2014-12-05 23:45:46 +09:00
parent 418d1bfc9a
commit 086c9493c8
2 changed files with 41 additions and 9 deletions

View File

@ -346,9 +346,10 @@ fn add_fragment_siblings_for_extension<'tcx>(this: &MoveData<'tcx>,
Rc<LoanPath<'tcx>>)>) { Rc<LoanPath<'tcx>>)>) {
let parent_ty = parent_lp.to_type(); let parent_ty = parent_lp.to_type();
let add_fragment_sibling_local = |field_name| { let add_fragment_sibling_local = |field_name, variant_did| {
add_fragment_sibling_core( add_fragment_sibling_core(
this, tcx, gathered_fragments, parent_lp.clone(), mc, field_name, origin_lp); this, tcx, gathered_fragments, parent_lp.clone(), mc, field_name, origin_lp,
variant_did);
}; };
match (&parent_ty.sty, enum_variant_info) { match (&parent_ty.sty, enum_variant_info) {
@ -363,7 +364,7 @@ fn add_fragment_siblings_for_extension<'tcx>(this: &MoveData<'tcx>,
for i in range(0, tuple_len) { for i in range(0, tuple_len) {
if i == tuple_idx { continue } if i == tuple_idx { continue }
let field_name = mc::PositionalField(i); let field_name = mc::PositionalField(i);
add_fragment_sibling_local(field_name); add_fragment_sibling_local(field_name, None);
} }
} }
@ -376,7 +377,7 @@ fn add_fragment_siblings_for_extension<'tcx>(this: &MoveData<'tcx>,
continue; continue;
} }
let field_name = mc::NamedField(f.name); let field_name = mc::NamedField(f.name);
add_fragment_sibling_local(field_name); add_fragment_sibling_local(field_name, None);
} }
} }
mc::PositionalField(tuple_idx) => { mc::PositionalField(tuple_idx) => {
@ -385,7 +386,7 @@ fn add_fragment_siblings_for_extension<'tcx>(this: &MoveData<'tcx>,
continue continue
} }
let field_name = mc::PositionalField(i); let field_name = mc::PositionalField(i);
add_fragment_sibling_local(field_name); add_fragment_sibling_local(field_name, None);
} }
} }
} }
@ -414,7 +415,7 @@ fn add_fragment_siblings_for_extension<'tcx>(this: &MoveData<'tcx>,
continue; continue;
} }
let field_name = mc::NamedField(variant_arg_ident.name); let field_name = mc::NamedField(variant_arg_ident.name);
add_fragment_sibling_local(field_name); add_fragment_sibling_local(field_name, Some(variant_info.id));
} }
} }
mc::PositionalField(tuple_idx) => { mc::PositionalField(tuple_idx) => {
@ -424,7 +425,7 @@ fn add_fragment_siblings_for_extension<'tcx>(this: &MoveData<'tcx>,
continue; continue;
} }
let field_name = mc::PositionalField(i); let field_name = mc::PositionalField(i);
add_fragment_sibling_local(field_name); add_fragment_sibling_local(field_name, None);
} }
} }
} }
@ -447,10 +448,11 @@ fn add_fragment_sibling_core<'tcx>(this: &MoveData<'tcx>,
parent: Rc<LoanPath<'tcx>>, parent: Rc<LoanPath<'tcx>>,
mc: mc::MutabilityCategory, mc: mc::MutabilityCategory,
new_field_name: mc::FieldName, new_field_name: mc::FieldName,
origin_lp: &Rc<LoanPath<'tcx>>) -> MovePathIndex { origin_lp: &Rc<LoanPath<'tcx>>,
enum_variant_did: Option<ast::DefId>) -> MovePathIndex {
let opt_variant_did = match parent.kind { let opt_variant_did = match parent.kind {
LpDowncast(_, variant_did) => Some(variant_did), LpDowncast(_, variant_did) => Some(variant_did),
LpVar(..) | LpUpvar(..) | LpExtend(..) => None, LpVar(..) | LpUpvar(..) | LpExtend(..) => enum_variant_did,
}; };
let loan_path_elem = LpInterior(mc::InteriorField(new_field_name)); let loan_path_elem = LpInterior(mc::InteriorField(new_field_name));

View File

@ -0,0 +1,30 @@
// 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 Homura {
Madoka {
name: String,
age: u32,
},
}
fn main() {
let homura = Homura::Madoka {
name: "Akemi".into_string(),
age: 14,
};
match homura {
Homura::Madoka {
name,
age,
} => (),
};
}