@@ -871,6 +871,8 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
871
871
. iter_enumerated ( )
872
872
. all ( |( i, v) | v. discr == ty:: VariantDiscr :: Relative ( i. as_u32 ( ) ) ) ;
873
873
874
+ let mut niche_filling_layout = None ;
875
+
874
876
// Niche-filling enum optimization.
875
877
if !def. repr . inhibit_enum_layout_opt ( ) && no_explicit_discriminants {
876
878
let mut dataful_variant = None ;
@@ -967,7 +969,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
967
969
let largest_niche =
968
970
Niche :: from_scalar ( dl, offset, niche_scalar. clone ( ) ) ;
969
971
970
- return Ok ( tcx . intern_layout ( Layout {
972
+ niche_filling_layout = Some ( Layout {
971
973
variants : Variants :: Multiple {
972
974
discr : niche_scalar,
973
975
discr_kind : DiscriminantKind :: Niche {
@@ -986,7 +988,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
986
988
largest_niche,
987
989
size,
988
990
align,
989
- } ) ) ;
991
+ } ) ;
990
992
}
991
993
}
992
994
}
@@ -1209,7 +1211,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
1209
1211
1210
1212
let largest_niche = Niche :: from_scalar ( dl, Size :: ZERO , tag. clone ( ) ) ;
1211
1213
1212
- tcx . intern_layout ( Layout {
1214
+ let tagged_layout = Layout {
1213
1215
variants : Variants :: Multiple {
1214
1216
discr : tag,
1215
1217
discr_kind : DiscriminantKind :: Tag ,
@@ -1224,7 +1226,9 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
1224
1226
abi,
1225
1227
align,
1226
1228
size,
1227
- } )
1229
+ } ;
1230
+
1231
+ tcx. intern_layout ( niche_filling_layout. unwrap_or ( tagged_layout) )
1228
1232
}
1229
1233
1230
1234
// Types with no meaningful known layout.
0 commit comments