@@ -20912,8 +20912,6 @@ fn reifyUnion(
20912
20912
std.hash.autoHash(&hasher, opt_tag_type_val.toIntern());
20913
20913
std.hash.autoHash(&hasher, fields_len);
20914
20914
20915
- var any_aligns = false;
20916
-
20917
20915
for (0..fields_len) |field_idx| {
20918
20916
const field_info = try fields_val.elemValue(pt, field_idx);
20919
20917
@@ -20922,16 +20920,11 @@ fn reifyUnion(
20922
20920
const field_align_val = try sema.resolveLazyValue(try field_info.fieldValue(pt, 2));
20923
20921
20924
20922
const field_name = try sema.sliceToIpString(block, src, field_name_val, .{ .simple = .union_field_name });
20925
-
20926
20923
std.hash.autoHash(&hasher, .{
20927
20924
field_name,
20928
20925
field_type_val.toIntern(),
20929
20926
field_align_val.toIntern(),
20930
20927
});
20931
-
20932
- if (field_align_val.toUnsignedInt(zcu) != 0) {
20933
- any_aligns = true;
20934
- }
20935
20928
}
20936
20929
20937
20930
const tracked_inst = try block.trackZir(inst);
@@ -20948,7 +20941,7 @@ fn reifyUnion(
20948
20941
true => .safety,
20949
20942
false => .none,
20950
20943
},
20951
- .any_aligned_fields = any_aligns ,
20944
+ .any_aligned_fields = layout != .@"packed" ,
20952
20945
.requires_comptime = .unknown,
20953
20946
.assumed_runtime_bits = false,
20954
20947
.assumed_pointer_aligned = false,
@@ -20981,8 +20974,7 @@ fn reifyUnion(
20981
20974
);
20982
20975
wip_ty.setName(ip, type_name.name, type_name.nav);
20983
20976
20984
- const field_types = try sema.arena.alloc(InternPool.Index, fields_len);
20985
- const field_aligns = if (any_aligns) try sema.arena.alloc(InternPool.Alignment, fields_len) else undefined;
20977
+ const loaded_union = ip.loadUnionType(wip_ty.index);
20986
20978
20987
20979
const enum_tag_ty, const has_explicit_tag = if (opt_tag_type_val.optionalValue(zcu)) |tag_type_val| tag_ty: {
20988
20980
switch (ip.indexToKey(tag_type_val.toIntern())) {
@@ -20995,11 +20987,12 @@ fn reifyUnion(
20995
20987
const tag_ty_fields_len = enum_tag_ty.enumFieldCount(zcu);
20996
20988
var seen_tags = try std.DynamicBitSetUnmanaged.initEmpty(sema.arena, tag_ty_fields_len);
20997
20989
20998
- for (field_types, 0..) |*field_ty, field_idx| {
20990
+ for (0..fields_len ) |field_idx| {
20999
20991
const field_info = try fields_val.elemValue(pt, field_idx);
21000
20992
21001
20993
const field_name_val = try field_info.fieldValue(pt, 0);
21002
20994
const field_type_val = try field_info.fieldValue(pt, 1);
20995
+ const field_alignment_val = try field_info.fieldValue(pt, 2);
21003
20996
21004
20997
// Don't pass a reason; first loop acts as an assertion that this is valid.
21005
20998
const field_name = try sema.sliceToIpString(block, src, field_name_val, undefined);
@@ -21016,10 +21009,12 @@ fn reifyUnion(
21016
21009
}
21017
21010
seen_tags.set(enum_index);
21018
21011
21019
- field_ty.* = field_type_val.toIntern();
21020
- if (any_aligns) {
21021
- const byte_align = try (try field_info.fieldValue(pt, 2)).toUnsignedIntSema(pt);
21022
- field_aligns[field_idx] = try sema.validateAlign(block, src, byte_align);
21012
+ loaded_union.field_types.get(ip)[field_idx] = field_type_val.toIntern();
21013
+ const byte_align = try field_alignment_val.toUnsignedIntSema(pt);
21014
+ if (layout == .@"packed") {
21015
+ if (byte_align != 0) return sema.fail(block, src, "alignment of a packed union field must be set to 0", .{});
21016
+ } else {
21017
+ loaded_union.field_aligns.get(ip)[field_idx] = try sema.validateAlign(block, src, byte_align);
21023
21018
}
21024
21019
}
21025
21020
@@ -21043,11 +21038,12 @@ fn reifyUnion(
21043
21038
var field_names: std.AutoArrayHashMapUnmanaged(InternPool.NullTerminatedString, void) = .empty;
21044
21039
try field_names.ensureTotalCapacity(sema.arena, fields_len);
21045
21040
21046
- for (field_types, 0..) |*field_ty, field_idx| {
21041
+ for (0..fields_len ) |field_idx| {
21047
21042
const field_info = try fields_val.elemValue(pt, field_idx);
21048
21043
21049
21044
const field_name_val = try field_info.fieldValue(pt, 0);
21050
21045
const field_type_val = try field_info.fieldValue(pt, 1);
21046
+ const field_alignment_val = try field_info.fieldValue(pt, 2);
21051
21047
21052
21048
// Don't pass a reason; first loop acts as an assertion that this is valid.
21053
21049
const field_name = try sema.sliceToIpString(block, src, field_name_val, undefined);
@@ -21057,10 +21053,12 @@ fn reifyUnion(
21057
21053
return sema.fail(block, src, "duplicate union field {f}", .{field_name.fmt(ip)});
21058
21054
}
21059
21055
21060
- field_ty.* = field_type_val.toIntern();
21061
- if (any_aligns) {
21062
- const byte_align = try (try field_info.fieldValue(pt, 2)).toUnsignedIntSema(pt);
21063
- field_aligns[field_idx] = try sema.validateAlign(block, src, byte_align);
21056
+ loaded_union.field_types.get(ip)[field_idx] = field_type_val.toIntern();
21057
+ const byte_align = try field_alignment_val.toUnsignedIntSema(pt);
21058
+ if (layout == .@"packed") {
21059
+ if (byte_align != 0) return sema.fail(block, src, "alignment of a packed union field must be set to 0", .{});
21060
+ } else {
21061
+ loaded_union.field_aligns.get(ip)[field_idx] = try sema.validateAlign(block, src, byte_align);
21064
21062
}
21065
21063
}
21066
21064
@@ -21069,7 +21067,7 @@ fn reifyUnion(
21069
21067
};
21070
21068
errdefer if (!has_explicit_tag) ip.remove(pt.tid, enum_tag_ty); // remove generated tag type on error
21071
21069
21072
- for (field_types) |field_ty_ip| {
21070
+ for (loaded_union. field_types.get(ip) ) |field_ty_ip| {
21073
21071
const field_ty: Type = .fromInterned(field_ty_ip);
21074
21072
if (field_ty.zigTypeTag(zcu) == .@"opaque") {
21075
21073
return sema.failWithOwnedErrorMsg(block, msg: {
@@ -21103,11 +21101,6 @@ fn reifyUnion(
21103
21101
}
21104
21102
}
21105
21103
21106
- const loaded_union = ip.loadUnionType(wip_ty.index);
21107
- loaded_union.setFieldTypes(ip, field_types);
21108
- if (any_aligns) {
21109
- loaded_union.setFieldAligns(ip, field_aligns);
21110
- }
21111
21104
loaded_union.setTagType(ip, enum_tag_ty);
21112
21105
loaded_union.setStatus(ip, .have_field_types);
21113
21106
@@ -21305,7 +21298,7 @@ fn reifyStruct(
21305
21298
.requires_comptime = .unknown,
21306
21299
.any_comptime_fields = any_comptime_fields,
21307
21300
.any_default_inits = any_default_inits,
21308
- .any_aligned_fields = true ,
21301
+ .any_aligned_fields = layout != .@"packed" ,
21309
21302
.inits_resolved = true,
21310
21303
.key = .{ .reified = .{
21311
21304
.zir_index = tracked_inst,
@@ -21354,7 +21347,7 @@ fn reifyStruct(
21354
21347
}
21355
21348
const byte_align = try field_alignment_val.toUnsignedIntSema(pt);
21356
21349
if (layout == .@"packed") {
21357
- if (byte_align != 0) return sema.fail(block, src, "alignment in a packed struct field must be set to 0", .{});
21350
+ if (byte_align != 0) return sema.fail(block, src, "alignment of a packed struct field must be set to 0", .{});
21358
21351
} else {
21359
21352
struct_type.field_aligns.get(ip)[field_idx] = try sema.validateAlign(block, src, byte_align);
21360
21353
}
0 commit comments