@@ -1235,7 +1235,11 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1235
1235
}
1236
1236
]
1237
1237
}
1238
- layout:: Variants :: Tagged { ref variants, .. } => {
1238
+ layout:: Variants :: Multiple {
1239
+ discr_kind : layout:: DiscriminantKind :: Tag ,
1240
+ ref variants,
1241
+ ..
1242
+ } => {
1239
1243
let discriminant_info = if fallback {
1240
1244
RegularDiscriminant ( self . discriminant_type_metadata
1241
1245
. expect ( "" ) )
@@ -1277,12 +1281,14 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1277
1281
}
1278
1282
} ) . collect ( )
1279
1283
}
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,
1283
1291
ref variants,
1284
- dataful_variant,
1285
- ref niche,
1286
1292
} => {
1287
1293
if fallback {
1288
1294
let variant = self . layout . for_variant ( cx, dataful_variant) ;
@@ -1369,7 +1375,11 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
1369
1375
let value = ( i. as_u32 ( ) as u128 )
1370
1376
. wrapping_sub ( niche_variants. start ( ) . as_u32 ( ) as u128 )
1371
1377
. 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) ;
1373
1383
Some ( value as u64 )
1374
1384
} ;
1375
1385
@@ -1586,8 +1596,11 @@ fn prepare_enum_metadata(
1586
1596
let layout = cx. layout_of ( enum_type) ;
1587
1597
1588
1598
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 ) ) ,
1591
1604
_ => { }
1592
1605
}
1593
1606
@@ -1599,9 +1612,16 @@ fn prepare_enum_metadata(
1599
1612
if use_enum_fallback ( cx) {
1600
1613
let discriminant_type_metadata = match layout. variants {
1601
1614
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 ) )
1605
1625
}
1606
1626
} ;
1607
1627
@@ -1636,16 +1656,20 @@ fn prepare_enum_metadata(
1636
1656
) ;
1637
1657
}
1638
1658
1639
- let discriminator_metadata = match & layout. variants {
1659
+ let discriminator_metadata = match layout. variants {
1640
1660
// A single-variant enum has no discriminant.
1641
- & layout:: Variants :: Single { .. } => None ,
1661
+ layout:: Variants :: Single { .. } => None ,
1642
1662
1643
- & layout:: Variants :: NicheFilling { ref niche, .. } => {
1663
+ layout:: Variants :: Multiple {
1664
+ discr_kind : layout:: DiscriminantKind :: Niche { .. } ,
1665
+ ref discr,
1666
+ ..
1667
+ } => {
1644
1668
// 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) ;
1647
1671
1648
- let discr_type = match niche . value {
1672
+ let discr_type = match discr . value {
1649
1673
layout:: Int ( t, _) => t,
1650
1674
layout:: Float ( layout:: FloatTy :: F32 ) => Integer :: I32 ,
1651
1675
layout:: Float ( layout:: FloatTy :: F64 ) => Integer :: I64 ,
@@ -1668,8 +1692,12 @@ fn prepare_enum_metadata(
1668
1692
}
1669
1693
} ,
1670
1694
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 ) ;
1673
1701
let ( size, align) = cx. size_and_align_of ( discr_type) ;
1674
1702
1675
1703
let discr_metadata = basic_type_metadata ( cx, discr_type) ;
0 commit comments