@@ -695,12 +695,9 @@ pub fn trans_const<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>, discr: D
695
695
let lldiscr = C_integral ( Type :: from_integer ( ccx, d) , discr. 0 as u64 , true ) ;
696
696
let mut vals_with_discr = vec ! [ lldiscr] ;
697
697
vals_with_discr. extend_from_slice ( vals) ;
698
- let mut contents = build_const_struct ( ccx, & variant. offset_after_field [ ..] ,
699
- & vals_with_discr[ ..] , variant. packed ) ;
700
- let needed_padding = l. size ( dl) . bytes ( ) - variant. min_size ( ) . bytes ( ) ;
701
- if needed_padding > 0 {
702
- contents. push ( padding ( ccx, needed_padding) ) ;
703
- }
698
+ let aligned_size = l. size ( dl) . bytes ( ) ;
699
+ let contents = build_const_struct ( ccx, & variant. offset_after_field [ ..] ,
700
+ & vals_with_discr[ ..] , variant. packed , aligned_size) ;
704
701
C_struct ( ccx, & contents[ ..] , false )
705
702
}
706
703
layout:: UntaggedUnion { ref variants, .. } => {
@@ -710,8 +707,9 @@ pub fn trans_const<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>, discr: D
710
707
}
711
708
layout:: Univariant { ref variant, .. } => {
712
709
assert_eq ! ( discr, Disr ( 0 ) ) ;
713
- let contents = build_const_struct ( ccx,
714
- & variant. offset_after_field [ ..] , vals, variant. packed ) ;
710
+ let aligned_size = l. size ( dl) . bytes ( ) ;
711
+ let contents = build_const_struct ( ccx, & variant. offset_after_field [ ..] ,
712
+ vals, variant. packed , aligned_size) ;
715
713
C_struct ( ccx, & contents[ ..] , variant. packed )
716
714
}
717
715
layout:: Vector { .. } => {
@@ -727,10 +725,11 @@ pub fn trans_const<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>, discr: D
727
725
}
728
726
}
729
727
layout:: StructWrappedNullablePointer { ref nonnull, nndiscr, .. } => {
728
+ let aligned_size = l. size ( dl) . bytes ( ) ;
730
729
if discr. 0 == nndiscr {
731
730
C_struct ( ccx, & build_const_struct ( ccx,
732
731
& nonnull. offset_after_field [ ..] ,
733
- vals, nonnull. packed ) ,
732
+ vals, nonnull. packed , aligned_size ) ,
734
733
false )
735
734
} else {
736
735
let fields = compute_fields ( ccx, t, nndiscr as usize , false ) ;
@@ -742,7 +741,8 @@ pub fn trans_const<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>, discr: D
742
741
C_struct ( ccx, & build_const_struct ( ccx,
743
742
& nonnull. offset_after_field [ ..] ,
744
743
& vals[ ..] ,
745
- false ) ,
744
+ false ,
745
+ aligned_size) ,
746
746
false )
747
747
}
748
748
}
@@ -761,7 +761,8 @@ pub fn trans_const<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>, discr: D
761
761
fn build_const_struct < ' a , ' tcx > ( ccx : & CrateContext < ' a , ' tcx > ,
762
762
offset_after_field : & [ layout:: Size ] ,
763
763
vals : & [ ValueRef ] ,
764
- packed : bool )
764
+ packed : bool ,
765
+ aligned_size : u64 )
765
766
-> Vec < ValueRef > {
766
767
assert_eq ! ( vals. len( ) , offset_after_field. len( ) ) ;
767
768
@@ -787,9 +788,8 @@ fn build_const_struct<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
787
788
}
788
789
}
789
790
790
- let size = offset_after_field. last ( ) . unwrap ( ) ;
791
- if offset < size. bytes ( ) {
792
- cfields. push ( padding ( ccx, size. bytes ( ) - offset) ) ;
791
+ if offset < aligned_size {
792
+ cfields. push ( padding ( ccx, aligned_size - offset) ) ;
793
793
}
794
794
795
795
cfields
0 commit comments