@@ -323,7 +323,7 @@ fn represent_type_uncached<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
323
323
mk_struct ( cx, & ftys[ ] , false , t)
324
324
} ) . collect ( ) ;
325
325
326
- ensure_enum_fits_in_address_space ( cx, ity , & fields[ ] , t) ;
326
+ ensure_enum_fits_in_address_space ( cx, & fields[ ] , t) ;
327
327
328
328
General ( ity, fields, dtor)
329
329
}
@@ -582,20 +582,14 @@ fn ensure_struct_fits_in_address_space<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
582
582
583
583
fn union_size_and_align ( sts : & [ Struct ] ) -> ( machine:: llsize , machine:: llalign ) {
584
584
let size = sts. iter ( ) . map ( |st| st. size ) . max ( ) . unwrap ( ) ;
585
- let most_aligned = sts. iter ( ) . max_by ( |st| st. align ) . unwrap ( ) ;
586
- ( size, most_aligned . align )
585
+ let align = sts. iter ( ) . map ( |st| st. align ) . max ( ) . unwrap ( ) ;
586
+ ( roundup ( size, align ) , align)
587
587
}
588
588
589
589
fn ensure_enum_fits_in_address_space < ' a , ' tcx > ( ccx : & CrateContext < ' a , ' tcx > ,
590
- discr : IntType ,
591
590
fields : & [ Struct ] ,
592
591
scapegoat : Ty < ' tcx > ) {
593
- let discr_size = machine:: llsize_of_alloc ( ccx, ll_inttype ( ccx, discr) ) ;
594
- let ( field_size, field_align) = union_size_and_align ( fields) ;
595
-
596
- // field_align < 1<<32, discr_size <= 8, field_size < OBJ_SIZE_BOUND <= 1<<61
597
- // so the sum is less than 1<<62 (and can't overflow).
598
- let total_size = roundup ( discr_size, field_align) + field_size;
592
+ let ( total_size, _) = union_size_and_align ( fields) ;
599
593
600
594
if total_size >= ccx. obj_size_bound ( ) {
601
595
ccx. report_overbig_object ( scapegoat) ;
@@ -667,9 +661,11 @@ fn generic_type_of<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
667
661
// FIXME #10604: this breaks when vector types are present.
668
662
let ( size, align) = union_size_and_align ( & sts[ ] ) ;
669
663
let align_s = align as u64 ;
664
+ assert_eq ! ( size % align_s, 0 ) ;
665
+ let align_units = size / align_s - 1 ;
666
+
670
667
let discr_ty = ll_inttype ( cx, ity) ;
671
668
let discr_size = machine:: llsize_of_alloc ( cx, discr_ty) ;
672
- let align_units = ( size + align_s - 1 ) / align_s - 1 ;
673
669
let fill_ty = match align_s {
674
670
1 => Type :: array ( & Type :: i8 ( cx) , align_units) ,
675
671
2 => Type :: array ( & Type :: i16 ( cx) , align_units) ,
@@ -1049,7 +1045,7 @@ pub fn trans_const<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, r: &Repr<'tcx>, discr
1049
1045
}
1050
1046
General ( ity, ref cases, _) => {
1051
1047
let case = & cases[ discr as uint ] ;
1052
- let max_sz = cases . iter ( ) . map ( |x| x . size ) . max ( ) . unwrap ( ) ;
1048
+ let ( max_sz, _ ) = union_size_and_align ( & cases [ ] ) ;
1053
1049
let lldiscr = C_integral ( ll_inttype ( ccx, ity) , discr as u64 , true ) ;
1054
1050
let mut f = vec ! [ lldiscr] ;
1055
1051
f. push_all ( vals) ;
0 commit comments