@@ -638,6 +638,10 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
638638 }
639639
640640 let calculate_niche_filling_layout = || -> Option < LayoutData < FieldIdx , VariantIdx > > {
641+ struct VariantLayoutInfo {
642+ align_abi : Align ,
643+ }
644+
641645 if repr. inhibit_enum_layout_opt ( ) {
642646 return None ;
643647 }
@@ -651,11 +655,14 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
651655 let mut unadjusted_abi_align = align;
652656 let mut combined_seed = repr. field_shuffle_seed ;
653657
658+ let mut variants_info = IndexVec :: < VariantIdx , _ > :: with_capacity ( variants. len ( ) ) ;
654659 let mut variant_layouts = variants
655660 . iter ( )
656661 . map ( |v| {
657662 let st = self . univariant ( v, repr, StructKind :: AlwaysSized ) . ok ( ) ?;
658663
664+ variants_info. push ( VariantLayoutInfo { align_abi : st. align . abi } ) ;
665+
659666 align = align. max ( st. align . abi ) ;
660667 max_repr_align = max_repr_align. max ( st. max_repr_align ) ;
661668 unadjusted_abi_align = unadjusted_abi_align. max ( st. unadjusted_abi_align ) ;
@@ -699,7 +706,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
699706 }
700707
701708 // Determine if it'll fit after the niche.
702- let this_align = layout . align . abi ;
709+ let this_align = variants_info [ i ] . align_abi ;
703710 let this_offset = ( niche_offset + niche_size) . align_to ( this_align) ;
704711
705712 if this_offset + layout. size > size {
@@ -730,7 +737,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
730737 . iter_enumerated ( )
731738 . all ( |( i, layout) | i == largest_variant_index || layout. size == Size :: ZERO ) ;
732739 let same_size = size == variant_layouts[ largest_variant_index] . size ;
733- let same_align = align == variant_layouts [ largest_variant_index] . align . abi ;
740+ let same_align = align == variants_info [ largest_variant_index] . align_abi ;
734741
735742 let uninhabited = variant_layouts. iter ( ) . all ( |v| v. is_uninhabited ( ) ) ;
736743 let abi = if same_size && same_align && others_zst {
@@ -1080,10 +1087,8 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
10801087 if matches ! ( variant. backend_repr, BackendRepr :: Memory { .. } if variant. has_fields( ) )
10811088 {
10821089 variant. backend_repr = abi;
1083- // Also need to bump up the size and alignment, so that the entire value fits
1084- // in here.
1090+ // Also need to bump up the size, so that the entire value fits in here.
10851091 variant. size = cmp:: max ( variant. size , size) ;
1086- variant. align . abi = cmp:: max ( variant. align . abi , align) ;
10871092 }
10881093 }
10891094 }
0 commit comments