aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorIsaac Freund <mail@isaacfreund.com>2022-08-08 18:39:14 +0200
committerIsaac Freund <mail@isaacfreund.com>2022-08-10 19:54:45 +0200
commit0d32b73078aa4579187f7d5c67343a6036eed277 (patch)
tree061cf1edf45d22198554159de00a7426748dad97 /src/type.zig
parentbb1c3e8b7e2be201221e14719d2d39e6298cc66c (diff)
downloadzig-0d32b73078aa4579187f7d5c67343a6036eed277.tar.gz
zig-0d32b73078aa4579187f7d5c67343a6036eed277.zip
stage2: Implement explicit backing integers for packed structs
Now the backing integer of a packed struct type may be explicitly specified with e.g. `packed struct(u32) { ... }`.
Diffstat (limited to 'src/type.zig')
-rw-r--r--src/type.zig23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/type.zig b/src/type.zig
index 85d77303c9..1b71f4e9b1 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -3000,9 +3000,17 @@ pub const Type = extern union {
.lazy => |arena| return AbiAlignmentAdvanced{ .val = try Value.Tag.lazy_align.create(arena, ty) },
};
if (struct_obj.layout == .Packed) {
- var buf: Type.Payload.Bits = undefined;
- const int_ty = struct_obj.packedIntegerType(target, &buf);
- return AbiAlignmentAdvanced{ .scalar = int_ty.abiAlignment(target) };
+ switch (strat) {
+ .sema_kit => |sk| try sk.sema.resolveTypeLayout(sk.block, sk.src, ty),
+ .lazy => |arena| {
+ if (!struct_obj.haveLayout()) {
+ return AbiAlignmentAdvanced{ .val = try Value.Tag.lazy_align.create(arena, ty) };
+ }
+ },
+ .eager => {},
+ }
+ assert(struct_obj.haveLayout());
+ return AbiAlignmentAdvanced{ .scalar = struct_obj.backing_int_ty.abiAlignment(target) };
}
const fields = ty.structFields();
@@ -3192,17 +3200,16 @@ pub const Type = extern union {
.Packed => {
const struct_obj = ty.castTag(.@"struct").?.data;
switch (strat) {
- .sema_kit => |sk| _ = try sk.sema.resolveTypeFields(sk.block, sk.src, ty),
+ .sema_kit => |sk| try sk.sema.resolveTypeLayout(sk.block, sk.src, ty),
.lazy => |arena| {
- if (!struct_obj.haveFieldTypes()) {
+ if (!struct_obj.haveLayout()) {
return AbiSizeAdvanced{ .val = try Value.Tag.lazy_size.create(arena, ty) };
}
},
.eager => {},
}
- var buf: Type.Payload.Bits = undefined;
- const int_ty = struct_obj.packedIntegerType(target, &buf);
- return AbiSizeAdvanced{ .scalar = int_ty.abiSize(target) };
+ assert(struct_obj.haveLayout());
+ return AbiSizeAdvanced{ .scalar = struct_obj.backing_int_ty.abiSize(target) };
},
else => {
switch (strat) {