@@ -592,14 +592,24 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
592592 let mut unadjusted_abi_align = align;
593593 let mut combined_seed = repr. field_shuffle_seed ;
594594
595+ let mut largest_variant_size = Size :: ZERO ;
596+ let mut largest_variant_index = VariantIdx :: new ( 0 ) ;
597+ let mut largest_variant_niche = None ;
598+
595599 let mut variants_info = IndexVec :: < VariantIdx , _ > :: with_capacity ( variants. len ( ) ) ;
596600 let mut variant_layouts = variants
597- . iter ( )
598- . map ( |v | {
601+ . iter_enumerated ( )
602+ . map ( |( i , v ) | {
599603 let st = self . univariant ( v, repr, StructKind :: AlwaysSized ) . ok ( ) ?;
600604
601605 variants_info. push ( VariantLayoutInfo { align_abi : st. align . abi } ) ;
602606
607+ if st. size > largest_variant_size {
608+ largest_variant_index = i;
609+ largest_variant_size = st. size ;
610+ largest_variant_niche = st. largest_niche ;
611+ }
612+
603613 align = align. max ( st. align . abi ) ;
604614 max_repr_align = max_repr_align. max ( st. max_repr_align ) ;
605615 unadjusted_abi_align = unadjusted_abi_align. max ( st. unadjusted_abi_align ) ;
@@ -609,11 +619,6 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
609619 } )
610620 . collect :: < Option < IndexVec < VariantIdx , _ > > > ( ) ?;
611621
612- let largest_variant_index = variant_layouts
613- . iter_enumerated ( )
614- . max_by_key ( |( _i, layout) | layout. size . bytes ( ) )
615- . map ( |( i, _layout) | i) ?;
616-
617622 let all_indices = variants. indices ( ) ;
618623 let needs_disc =
619624 |index : VariantIdx | index != largest_variant_index && !absent ( & variants[ index] ) ;
@@ -624,19 +629,17 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
624629 ( niche_variants. end ( ) . index ( ) as u128 - niche_variants. start ( ) . index ( ) as u128 ) + 1 ;
625630
626631 // Use the largest niche in the largest variant.
627- let niche = variant_layouts [ largest_variant_index ] . largest_niche ?;
632+ let niche = largest_variant_niche ?;
628633 let ( niche_start, niche_scalar) = niche. reserve ( dl, count) ?;
629634 let niche_offset = niche. offset ;
630635 let niche_size = niche. value . size ( dl) ;
631- let size = variant_layouts [ largest_variant_index ] . size . align_to ( align) ;
636+ let size = largest_variant_size . align_to ( align) ;
632637
633638 let all_variants_fit = variant_layouts. iter_enumerated_mut ( ) . all ( |( i, layout) | {
634639 if i == largest_variant_index {
635640 return true ;
636641 }
637642
638- layout. largest_niche = None ;
639-
640643 if layout. size <= niche_offset {
641644 // This variant will fit before the niche.
642645 return true ;
0 commit comments