@@ -40,6 +40,7 @@ pub trait LayoutCalculator {
4040 largest_niche,
4141 align,
4242 size,
43+ has_repr_align : false ,
4344 }
4445 }
4546
@@ -122,6 +123,7 @@ pub trait LayoutCalculator {
122123 largest_niche : None ,
123124 align : dl. i8_align ,
124125 size : Size :: ZERO ,
126+ has_repr_align : false ,
125127 }
126128 }
127129
@@ -422,6 +424,7 @@ pub trait LayoutCalculator {
422424 largest_niche,
423425 size,
424426 align,
427+ has_repr_align : repr. align . is_some ( ) ,
425428 } ;
426429
427430 Some ( TmpLayout { layout, variants : variant_layouts } )
@@ -691,6 +694,7 @@ pub trait LayoutCalculator {
691694 abi,
692695 align,
693696 size,
697+ has_repr_align : repr. align . is_some ( ) ,
694698 } ;
695699
696700 let tagged_layout = TmpLayout { layout : tagged_layout, variants : layout_variants } ;
@@ -809,6 +813,7 @@ pub trait LayoutCalculator {
809813 largest_niche : None ,
810814 align,
811815 size : size. align_to ( align. abi ) ,
816+ has_repr_align : repr. align . is_some ( ) ,
812817 } )
813818 }
814819}
@@ -1036,6 +1041,7 @@ fn univariant(
10361041 inverse_memory_index. into_iter ( ) . map ( FieldIdx :: as_u32) . collect ( )
10371042 } ;
10381043 let size = min_size. align_to ( align. abi ) ;
1044+ let mut layout_of_single_non_zst_field = None ;
10391045 let mut abi = Abi :: Aggregate { sized } ;
10401046 // Unpack newtype ABIs and find scalar pairs.
10411047 if sized && size. bytes ( ) > 0 {
@@ -1045,6 +1051,8 @@ fn univariant(
10451051 match ( non_zst_fields. next ( ) , non_zst_fields. next ( ) , non_zst_fields. next ( ) ) {
10461052 // We have exactly one non-ZST field.
10471053 ( Some ( ( i, field) ) , None , None ) => {
1054+ layout_of_single_non_zst_field = Some ( field) ;
1055+
10481056 // Field fills the struct and it has a scalar or scalar pair ABI.
10491057 if offsets[ i] . bytes ( ) == 0 && align. abi == field. align ( ) . abi && size == field. size ( )
10501058 {
@@ -1102,13 +1110,19 @@ fn univariant(
11021110 if fields. iter ( ) . any ( |f| f. abi ( ) . is_uninhabited ( ) ) {
11031111 abi = Abi :: Uninhabited ;
11041112 }
1113+
1114+ let has_repr_align = repr. align . is_some ( )
1115+ || repr. transparent ( )
1116+ && layout_of_single_non_zst_field. map_or ( false , |l| l. has_repr_align ( ) ) ;
1117+
11051118 Some ( LayoutS {
11061119 variants : Variants :: Single { index : FIRST_VARIANT } ,
11071120 fields : FieldsShape :: Arbitrary { offsets, memory_index } ,
11081121 abi,
11091122 largest_niche,
11101123 align,
11111124 size,
1125+ has_repr_align,
11121126 } )
11131127}
11141128
0 commit comments