| ... | ... | @@ -3915,29 +3915,30 @@ fn resolveUnionInner( |
| 3915 | 3915 | pub fn getUnionLayout(loaded_union: InternPool.LoadedUnionType, zcu: *const Zcu) Zcu.UnionLayout { |
| 3916 | 3916 | const ip = &zcu.intern_pool; |
| 3917 | 3917 | assert(loaded_union.haveLayout(ip)); |
| 3918 | | var most_aligned_field: u32 = undefined; |
| 3919 | | var most_aligned_field_size: u64 = undefined; |
| 3920 | | var biggest_field: u32 = undefined; |
| 3918 | var most_aligned_field: u32 = 0; |
| 3919 | var most_aligned_field_align: InternPool.Alignment = .@"1"; |
| 3920 | var most_aligned_field_size: u64 = 0; |
| 3921 | var biggest_field: u32 = 0; |
| 3921 | 3922 | var payload_size: u64 = 0; |
| 3922 | 3923 | var payload_align: InternPool.Alignment = .@"1"; |
| 3923 | | for (loaded_union.field_types.get(ip), 0..) |field_ty, field_index| { |
| 3924 | | if (Type.fromInterned(field_ty).isNoReturn(zcu)) continue; |
| 3924 | for (loaded_union.field_types.get(ip), 0..) |field_ty_ip_index, field_index| { |
| 3925 | const field_ty: Type = .fromInterned(field_ty_ip_index); |
| 3926 | if (field_ty.isNoReturn(zcu)) continue; |
| 3925 | 3927 | |
| 3926 | 3928 | const explicit_align = loaded_union.fieldAlign(ip, field_index); |
| 3927 | 3929 | const field_align = if (explicit_align != .none) |
| 3928 | 3930 | explicit_align |
| 3929 | 3931 | else |
| 3930 | | Type.fromInterned(field_ty).abiAlignment(zcu); |
| 3931 | | if (Type.fromInterned(field_ty).hasRuntimeBits(zcu)) { |
| 3932 | | const field_size = Type.fromInterned(field_ty).abiSize(zcu); |
| 3933 | | if (field_size > payload_size) { |
| 3934 | | payload_size = field_size; |
| 3935 | | biggest_field = @intCast(field_index); |
| 3936 | | } |
| 3937 | | if (field_align.compare(.gte, payload_align)) { |
| 3938 | | most_aligned_field = @intCast(field_index); |
| 3939 | | most_aligned_field_size = field_size; |
| 3940 | | } |
| 3932 | field_ty.abiAlignment(zcu); |
| 3933 | const field_size = field_ty.abiSize(zcu); |
| 3934 | if (field_size > payload_size) { |
| 3935 | payload_size = field_size; |
| 3936 | biggest_field = @intCast(field_index); |
| 3937 | } |
| 3938 | if (field_size > 0 and field_align.compare(.gte, most_aligned_field_align)) { |
| 3939 | most_aligned_field = @intCast(field_index); |
| 3940 | most_aligned_field_align = field_align; |
| 3941 | most_aligned_field_size = field_size; |
| 3941 | 3942 | } |
| 3942 | 3943 | payload_align = payload_align.max(field_align); |
| 3943 | 3944 | } |