aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-09-25 17:52:50 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-09-25 17:54:52 -0700
commit04366576ea4be4959b596ebff7041d17e18d08d8 (patch)
tree94dceb8f1e846e09356e5b40b884791a7cc314eb /src/type.zig
parent15f55b2805541276f491d255f60f501c8cbd1191 (diff)
downloadzig-04366576ea4be4959b596ebff7041d17e18d08d8.tar.gz
zig-04366576ea4be4959b596ebff7041d17e18d08d8.zip
stage2: implement `@sizeOf` for non-packed structs
Diffstat (limited to 'src/type.zig')
-rw-r--r--src/type.zig16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/type.zig b/src/type.zig
index 0381111345..bd008e809a 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -1765,7 +1765,21 @@ pub const Type = extern union {
.@"struct" => {
const s = self.castTag(.@"struct").?.data;
assert(s.status == .have_layout);
- @panic("TODO abiSize struct");
+ const is_packed = s.layout == .Packed;
+ if (is_packed) @panic("TODO packed structs");
+ var size: u64 = 0;
+ for (s.fields.values()) |field| {
+ const field_align = a: {
+ if (field.abi_align.tag() == .abi_align_default) {
+ break :a field.ty.abiAlignment(target);
+ } else {
+ break :a field.abi_align.toUnsignedInt();
+ }
+ };
+ size = std.mem.alignForwardGeneric(u64, size, field_align);
+ size += field.ty.abiSize(target);
+ }
+ return size;
},
.enum_simple, .enum_full, .enum_nonexhaustive => {
var buffer: Payload.Bits = undefined;