@@ -5,7 +5,8 @@ use rustc_codegen_ssa::{
55 debuginfo:: { type_names:: compute_debuginfo_type_name, wants_c_like_enum_debuginfo} ,
66 traits:: ConstMethods ,
77} ;
8- use rustc_data_structures:: fx:: FxHashMap ;
8+
9+ use rustc_index:: vec:: IndexVec ;
910use rustc_middle:: {
1011 bug,
1112 ty:: {
@@ -680,6 +681,7 @@ fn build_union_fields_for_direct_tag_generator<'ll, 'tcx>(
680681
681682 let common_upvar_names = closure_saved_names_of_captured_variables ( cx. tcx , generator_def_id) ;
682683 let variant_range = generator_substs. variant_range ( generator_def_id, cx. tcx ) ;
684+ let variant_count = ( variant_range. start . as_u32 ( ) ..variant_range. end . as_u32 ( ) ) . len ( ) ;
683685
684686 let tag_base_type = tag_base_type ( cx, generator_type_and_layout) ;
685687
@@ -691,10 +693,17 @@ fn build_union_fields_for_direct_tag_generator<'ll, 'tcx>(
691693 . map ( |variant_index| ( variant_index, GeneratorSubsts :: variant_name ( variant_index) ) ) ,
692694 ) ;
693695
694- let discriminants: FxHashMap < VariantIdx , DiscrResult > = generator_substs
695- . discriminants ( generator_def_id, cx. tcx )
696- . map ( |( variant_index, discr) | ( variant_index, DiscrResult :: Value ( discr. val ) ) )
697- . collect ( ) ;
696+ let discriminants: IndexVec < VariantIdx , DiscrResult > = {
697+ let discriminants_iter = generator_substs. discriminants ( generator_def_id, cx. tcx ) ;
698+ let mut discriminants: IndexVec < VariantIdx , DiscrResult > =
699+ IndexVec :: with_capacity ( variant_count) ;
700+ for ( variant_index, discr) in discriminants_iter {
701+ // Assert that the index in the IndexMap matches up with the given VariantIdx.
702+ assert_eq ! ( variant_index, discriminants. next_index( ) ) ;
703+ discriminants. push ( DiscrResult :: Value ( discr. val ) ) ;
704+ }
705+ discriminants
706+ } ;
698707
699708 // Build the type node for each field.
700709 let variant_field_infos: SmallVec < VariantFieldInfo < ' ll > > = variant_range
@@ -721,7 +730,7 @@ fn build_union_fields_for_direct_tag_generator<'ll, 'tcx>(
721730 variant_index,
722731 variant_struct_type_di_node,
723732 source_info,
724- discr : discriminants[ & variant_index] ,
733+ discr : discriminants[ variant_index] ,
725734 }
726735 } )
727736 . collect ( ) ;
0 commit comments