@@ -575,6 +575,10 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
575575 }
576576
577577 let calculate_niche_filling_layout = || -> Option < LayoutData < FieldIdx , VariantIdx > > {
578+ struct VariantLayoutInfo {
579+ align_abi : Align ,
580+ }
581+
578582 if repr. inhibit_enum_layout_opt ( ) {
579583 return None ;
580584 }
@@ -588,11 +592,14 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
588592 let mut unadjusted_abi_align = align;
589593 let mut combined_seed = repr. field_shuffle_seed ;
590594
595+ let mut variants_info = IndexVec :: < VariantIdx , _ > :: with_capacity ( variants. len ( ) ) ;
591596 let mut variant_layouts = variants
592597 . iter ( )
593598 . map ( |v| {
594599 let st = self . univariant ( v, repr, StructKind :: AlwaysSized ) . ok ( ) ?;
595600
601+ variants_info. push ( VariantLayoutInfo { align_abi : st. align . abi } ) ;
602+
596603 align = align. max ( st. align . abi ) ;
597604 max_repr_align = max_repr_align. max ( st. max_repr_align ) ;
598605 unadjusted_abi_align = unadjusted_abi_align. max ( st. unadjusted_abi_align ) ;
@@ -636,7 +643,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
636643 }
637644
638645 // Determine if it'll fit after the niche.
639- let this_align = layout . align . abi ;
646+ let this_align = variants_info [ i ] . align_abi ;
640647 let this_offset = ( niche_offset + niche_size) . align_to ( this_align) ;
641648
642649 if this_offset + layout. size > size {
@@ -667,7 +674,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
667674 . iter_enumerated ( )
668675 . all ( |( i, layout) | i == largest_variant_index || layout. size == Size :: ZERO ) ;
669676 let same_size = size == variant_layouts[ largest_variant_index] . size ;
670- let same_align = align == variant_layouts [ largest_variant_index] . align . abi ;
677+ let same_align = align == variants_info [ largest_variant_index] . align_abi ;
671678
672679 let uninhabited = variant_layouts. iter ( ) . all ( |v| v. is_uninhabited ( ) ) ;
673680 let abi = if same_size && same_align && others_zst {
@@ -1017,10 +1024,8 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
10171024 if matches ! ( variant. backend_repr, BackendRepr :: Memory { .. } if variant. has_fields( ) )
10181025 {
10191026 variant. backend_repr = abi;
1020- // Also need to bump up the size and alignment, so that the entire value fits
1021- // in here.
1027+ // Also need to bump up the size, so that the entire value fits in here.
10221028 variant. size = cmp:: max ( variant. size , size) ;
1023- variant. align . abi = cmp:: max ( variant. align . abi , align) ;
10241029 }
10251030 }
10261031 }
0 commit comments