From 56658622c36f800a8583df194a70deffa9771a34 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Fri, 16 Dec 2022 00:23:22 +0200 Subject: [PATCH] Type: fix incorrect usage of `hasRuntimeBits` Closes #13962 --- src/type.zig | 10 ++++++++-- test/behavior/sizeof_and_typeof.zig | 5 +++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/type.zig b/src/type.zig index 5e6f032798a9..abedf25da817 100644 --- a/src/type.zig +++ b/src/type.zig @@ -3475,7 +3475,10 @@ pub const Type = extern union { return AbiSizeAdvanced{ .scalar = 0 }; } - if (!child_type.hasRuntimeBits()) return AbiSizeAdvanced{ .scalar = 1 }; + if (!(child_type.hasRuntimeBitsAdvanced(false, strat) catch |err| switch (err) { + error.NeedLazy => return AbiSizeAdvanced{ .val = try Value.Tag.lazy_size.create(strat.lazy, ty) }, + else => |e| return e, + })) return AbiSizeAdvanced{ .scalar = 1 }; if (ty.optionalReprIsPayload()) { return abiSizeAdvanced(child_type, target, strat); @@ -3504,7 +3507,10 @@ pub const Type = extern union { // in abiAlignmentAdvanced. const data = ty.castTag(.error_union).?.data; const code_size = abiSize(Type.anyerror, target); - if (!data.payload.hasRuntimeBits()) { + if (!(data.payload.hasRuntimeBitsAdvanced(false, strat) catch |err| switch (err) { + error.NeedLazy => return AbiSizeAdvanced{ .val = try Value.Tag.lazy_size.create(strat.lazy, ty) }, + else => |e| return e, + })) { // Same as anyerror. return AbiSizeAdvanced{ .scalar = code_size }; } diff --git a/test/behavior/sizeof_and_typeof.zig b/test/behavior/sizeof_and_typeof.zig index b6194000400a..b38f28acb890 100644 --- a/test/behavior/sizeof_and_typeof.zig +++ b/test/behavior/sizeof_and_typeof.zig @@ -288,3 +288,8 @@ test "runtime instructions inside typeof in comptime only scope" { try expect(@TypeOf((T{}).b) == i8); } } + +test "@sizeOf optional of previously unresolved union" { + const Node = union { a: usize }; + try expect(@sizeOf(?Node) == @sizeOf(Node) + @alignOf(Node)); +}