@@ -410,8 +410,13 @@ fn trans_stmt<'a, 'tcx: 'a>(
410410 layout:: Variants :: Single { index } => {
411411 assert_eq ! ( index, * variant_index) ;
412412 }
413- layout:: Variants :: Multiple { discr_kind : layout:: DiscriminantKind :: Tag , .. } => {
414- let ptr = place. place_field ( fx, mir:: Field :: new ( 0 ) ) ;
413+ layout:: Variants :: Multiple {
414+ discr : _,
415+ discr_index,
416+ discr_kind : layout:: DiscriminantKind :: Tag ,
417+ variants : _,
418+ } => {
419+ let ptr = place. place_field ( fx, mir:: Field :: new ( discr_index) ) ;
415420 let to = layout
416421 . ty
417422 . ty_adt_def ( )
@@ -422,15 +427,17 @@ fn trans_stmt<'a, 'tcx: 'a>(
422427 ptr. write_cvalue ( fx, discr) ;
423428 }
424429 layout:: Variants :: Multiple {
430+ discr : _,
431+ discr_index,
425432 discr_kind : layout:: DiscriminantKind :: Niche {
426433 dataful_variant,
427434 ref niche_variants,
428435 niche_start,
429436 } ,
430- ..
437+ variants : _ ,
431438 } => {
432439 if * variant_index != dataful_variant {
433- let niche = place. place_field ( fx, mir:: Field :: new ( 0 ) ) ;
440+ let niche = place. place_field ( fx, mir:: Field :: new ( discr_index ) ) ;
434441 //let niche_llty = niche.layout.immediate_llvm_type(bx.cx);
435442 let niche_value =
436443 ( ( variant_index. as_u32 ( ) - niche_variants. start ( ) . as_u32 ( ) ) as u128 )
@@ -767,7 +774,7 @@ pub fn trans_get_discriminant<'a, 'tcx: 'a>(
767774 return trap_unreachable_ret_value ( fx, dest_layout, "[panic] Tried to get discriminant for uninhabited type." ) ;
768775 }
769776
770- let ( discr_scalar, discr_kind) = match & layout. variants {
777+ let ( discr_scalar, discr_index , discr_kind) = match & layout. variants {
771778 layout:: Variants :: Single { index } => {
772779 let discr_val = layout
773780 . ty
@@ -777,10 +784,12 @@ pub fn trans_get_discriminant<'a, 'tcx: 'a>(
777784 } ) ;
778785 return CValue :: const_val ( fx, dest_layout. ty , discr_val as u64 as i64 ) ;
779786 }
780- layout:: Variants :: Multiple { discr, discr_kind, variants : _ } => ( discr, discr_kind) ,
787+ layout:: Variants :: Multiple { discr, discr_index, discr_kind, variants : _ } => {
788+ ( discr, * discr_index, discr_kind)
789+ }
781790 } ;
782791
783- let discr = place. place_field ( fx, mir:: Field :: new ( 0 ) ) . to_cvalue ( fx) ;
792+ let discr = place. place_field ( fx, mir:: Field :: new ( discr_index ) ) . to_cvalue ( fx) ;
784793 let discr_ty = discr. layout ( ) . ty ;
785794 let lldiscr = discr. load_scalar ( fx) ;
786795 match discr_kind {
0 commit comments