@@ -1246,7 +1246,11 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1246
1246
}
1247
1247
]
1248
1248
}
1249
- layout:: Variants :: Tagged { ref variants, .. } => {
1249
+ layout:: Variants :: Multiple {
1250
+ discr_kind : layout:: DiscriminantKind :: Tag ,
1251
+ ref variants,
1252
+ ..
1253
+ } => {
1250
1254
let discriminant_info = if fallback {
1251
1255
RegularDiscriminant ( self . discriminant_type_metadata
1252
1256
. expect ( "" ) )
@@ -1288,12 +1292,14 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1288
1292
}
1289
1293
} ) . collect ( )
1290
1294
}
1291
- layout:: Variants :: NicheFilling {
1292
- ref niche_variants,
1293
- niche_start,
1295
+ layout:: Variants :: Multiple {
1296
+ discr_kind : layout:: DiscriminantKind :: Niche {
1297
+ ref niche_variants,
1298
+ niche_start,
1299
+ dataful_variant,
1300
+ } ,
1301
+ ref discr,
1294
1302
ref variants,
1295
- dataful_variant,
1296
- ref niche,
1297
1303
} => {
1298
1304
if fallback {
1299
1305
let variant = self . layout . for_variant ( cx, dataful_variant) ;
@@ -1380,7 +1386,11 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1380
1386
let value = ( i. as_u32 ( ) as u128 )
1381
1387
. wrapping_sub ( niche_variants. start ( ) . as_u32 ( ) as u128 )
1382
1388
. wrapping_add ( niche_start) ;
1383
- let value = truncate ( value, niche. value . size ( cx) ) ;
1389
+ let value = truncate ( value, discr. value . size ( cx) ) ;
1390
+ // NOTE(eddyb) do *NOT* remove this assert, until
1391
+ // we pass the full 128-bit value to LLVM, otherwise
1392
+ // truncation will be silent and remain undetected.
1393
+ assert_eq ! ( value as u64 as u128 , value) ;
1384
1394
Some ( value as u64 )
1385
1395
} ;
1386
1396
@@ -1597,8 +1607,11 @@ fn prepare_enum_metadata(
1597
1607
let layout = cx. layout_of ( enum_type) ;
1598
1608
1599
1609
match ( & layout. abi , & layout. variants ) {
1600
- ( & layout:: Abi :: Scalar ( _) , & layout:: Variants :: Tagged { ref tag, .. } ) =>
1601
- return FinalMetadata ( discriminant_type_metadata ( tag. value ) ) ,
1610
+ ( & layout:: Abi :: Scalar ( _) , & layout:: Variants :: Multiple {
1611
+ discr_kind : layout:: DiscriminantKind :: Tag ,
1612
+ ref discr,
1613
+ ..
1614
+ } ) => return FinalMetadata ( discriminant_type_metadata ( discr. value ) ) ,
1602
1615
_ => { }
1603
1616
}
1604
1617
@@ -1610,9 +1623,16 @@ fn prepare_enum_metadata(
1610
1623
if use_enum_fallback ( cx) {
1611
1624
let discriminant_type_metadata = match layout. variants {
1612
1625
layout:: Variants :: Single { .. } |
1613
- layout:: Variants :: NicheFilling { .. } => None ,
1614
- layout:: Variants :: Tagged { ref tag, .. } => {
1615
- Some ( discriminant_type_metadata ( tag. value ) )
1626
+ layout:: Variants :: Multiple {
1627
+ discr_kind : layout:: DiscriminantKind :: Niche { .. } ,
1628
+ ..
1629
+ } => None ,
1630
+ layout:: Variants :: Multiple {
1631
+ discr_kind : layout:: DiscriminantKind :: Tag ,
1632
+ ref discr,
1633
+ ..
1634
+ } => {
1635
+ Some ( discriminant_type_metadata ( discr. value ) )
1616
1636
}
1617
1637
} ;
1618
1638
@@ -1647,16 +1667,20 @@ fn prepare_enum_metadata(
1647
1667
) ;
1648
1668
}
1649
1669
1650
- let discriminator_metadata = match & layout. variants {
1670
+ let discriminator_metadata = match layout. variants {
1651
1671
// A single-variant enum has no discriminant.
1652
- & layout:: Variants :: Single { .. } => None ,
1672
+ layout:: Variants :: Single { .. } => None ,
1653
1673
1654
- & layout:: Variants :: NicheFilling { ref niche, .. } => {
1674
+ layout:: Variants :: Multiple {
1675
+ discr_kind : layout:: DiscriminantKind :: Niche { .. } ,
1676
+ ref discr,
1677
+ ..
1678
+ } => {
1655
1679
// Find the integer type of the correct size.
1656
- let size = niche . value . size ( cx) ;
1657
- let align = niche . value . align ( cx) ;
1680
+ let size = discr . value . size ( cx) ;
1681
+ let align = discr . value . align ( cx) ;
1658
1682
1659
- let discr_type = match niche . value {
1683
+ let discr_type = match discr . value {
1660
1684
layout:: Int ( t, _) => t,
1661
1685
layout:: Float ( layout:: FloatTy :: F32 ) => Integer :: I32 ,
1662
1686
layout:: Float ( layout:: FloatTy :: F64 ) => Integer :: I64 ,
@@ -1679,8 +1703,12 @@ fn prepare_enum_metadata(
1679
1703
}
1680
1704
} ,
1681
1705
1682
- & layout:: Variants :: Tagged { ref tag, .. } => {
1683
- let discr_type = tag. value . to_ty ( cx. tcx ) ;
1706
+ layout:: Variants :: Multiple {
1707
+ discr_kind : layout:: DiscriminantKind :: Tag ,
1708
+ ref discr,
1709
+ ..
1710
+ } => {
1711
+ let discr_type = discr. value . to_ty ( cx. tcx ) ;
1684
1712
let ( size, align) = cx. size_and_align_of ( discr_type) ;
1685
1713
1686
1714
let discr_metadata = basic_type_metadata ( cx, discr_type) ;
0 commit comments