@@ -1235,7 +1235,11 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
12351235 }
12361236 ]
12371237 }
1238- layout:: Variants :: Tagged { ref variants, .. } => {
1238+ layout:: Variants :: Multiple {
1239+ discr_kind : layout:: DiscriminantKind :: Tag ,
1240+ ref variants,
1241+ ..
1242+ } => {
12391243 let discriminant_info = if fallback {
12401244 RegularDiscriminant ( self . discriminant_type_metadata
12411245 . expect ( "" ) )
@@ -1277,12 +1281,14 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
12771281 }
12781282 } ) . collect ( )
12791283 }
1280- layout:: Variants :: NicheFilling {
1281- ref niche_variants,
1282- niche_start,
1284+ layout:: Variants :: Multiple {
1285+ discr_kind : layout:: DiscriminantKind :: Niche {
1286+ ref niche_variants,
1287+ niche_start,
1288+ dataful_variant,
1289+ } ,
1290+ ref discr,
12831291 ref variants,
1284- dataful_variant,
1285- ref niche,
12861292 } => {
12871293 if fallback {
12881294 let variant = self . layout . for_variant ( cx, dataful_variant) ;
@@ -1369,7 +1375,11 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
13691375 let value = ( i. as_u32 ( ) as u128 )
13701376 . wrapping_sub ( niche_variants. start ( ) . as_u32 ( ) as u128 )
13711377 . wrapping_add ( niche_start) ;
1372- let value = truncate ( value, niche. value . size ( cx) ) ;
1378+ let value = truncate ( value, discr. value . size ( cx) ) ;
1379+ // NOTE(eddyb) do *NOT* remove this assert, until
1380+ // we pass the full 128-bit value to LLVM, otherwise
1381+ // truncation will be silent and remain undetected.
1382+ assert_eq ! ( value as u64 as u128 , value) ;
13731383 Some ( value as u64 )
13741384 } ;
13751385
@@ -1586,8 +1596,11 @@ fn prepare_enum_metadata(
15861596 let layout = cx. layout_of ( enum_type) ;
15871597
15881598 match ( & layout. abi , & layout. variants ) {
1589- ( & layout:: Abi :: Scalar ( _) , & layout:: Variants :: Tagged { ref tag, .. } ) =>
1590- return FinalMetadata ( discriminant_type_metadata ( tag. value ) ) ,
1599+ ( & layout:: Abi :: Scalar ( _) , & layout:: Variants :: Multiple {
1600+ discr_kind : layout:: DiscriminantKind :: Tag ,
1601+ ref discr,
1602+ ..
1603+ } ) => return FinalMetadata ( discriminant_type_metadata ( discr. value ) ) ,
15911604 _ => { }
15921605 }
15931606
@@ -1599,9 +1612,16 @@ fn prepare_enum_metadata(
15991612 if use_enum_fallback ( cx) {
16001613 let discriminant_type_metadata = match layout. variants {
16011614 layout:: Variants :: Single { .. } |
1602- layout:: Variants :: NicheFilling { .. } => None ,
1603- layout:: Variants :: Tagged { ref tag, .. } => {
1604- Some ( discriminant_type_metadata ( tag. value ) )
1615+ layout:: Variants :: Multiple {
1616+ discr_kind : layout:: DiscriminantKind :: Niche { .. } ,
1617+ ..
1618+ } => None ,
1619+ layout:: Variants :: Multiple {
1620+ discr_kind : layout:: DiscriminantKind :: Tag ,
1621+ ref discr,
1622+ ..
1623+ } => {
1624+ Some ( discriminant_type_metadata ( discr. value ) )
16051625 }
16061626 } ;
16071627
@@ -1636,16 +1656,20 @@ fn prepare_enum_metadata(
16361656 ) ;
16371657 }
16381658
1639- let discriminator_metadata = match & layout. variants {
1659+ let discriminator_metadata = match layout. variants {
16401660 // A single-variant enum has no discriminant.
1641- & layout:: Variants :: Single { .. } => None ,
1661+ layout:: Variants :: Single { .. } => None ,
16421662
1643- & layout:: Variants :: NicheFilling { ref niche, .. } => {
1663+ layout:: Variants :: Multiple {
1664+ discr_kind : layout:: DiscriminantKind :: Niche { .. } ,
1665+ ref discr,
1666+ ..
1667+ } => {
16441668 // Find the integer type of the correct size.
1645- let size = niche . value . size ( cx) ;
1646- let align = niche . value . align ( cx) ;
1669+ let size = discr . value . size ( cx) ;
1670+ let align = discr . value . align ( cx) ;
16471671
1648- let discr_type = match niche . value {
1672+ let discr_type = match discr . value {
16491673 layout:: Int ( t, _) => t,
16501674 layout:: Float ( layout:: FloatTy :: F32 ) => Integer :: I32 ,
16511675 layout:: Float ( layout:: FloatTy :: F64 ) => Integer :: I64 ,
@@ -1668,8 +1692,12 @@ fn prepare_enum_metadata(
16681692 }
16691693 } ,
16701694
1671- & layout:: Variants :: Tagged { ref tag, .. } => {
1672- let discr_type = tag. value . to_ty ( cx. tcx ) ;
1695+ layout:: Variants :: Multiple {
1696+ discr_kind : layout:: DiscriminantKind :: Tag ,
1697+ ref discr,
1698+ ..
1699+ } => {
1700+ let discr_type = discr. value . to_ty ( cx. tcx ) ;
16731701 let ( size, align) = cx. size_and_align_of ( discr_type) ;
16741702
16751703 let discr_metadata = basic_type_metadata ( cx, discr_type) ;
0 commit comments