diff --git a/src/Sema.zig b/src/Sema.zig index a3207b8539..24bbdb0b0c 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -1698,7 +1698,10 @@ fn resolveMaybeUndefValIntable( .elem_ptr => check = check.castTag(.elem_ptr).?.data.array_ptr, .eu_payload_ptr, .opt_payload_ptr => check = check.cast(Value.Payload.PayloadPtr).?.data.container_ptr, .generic_poison => return error.GenericPoison, - else => return val, + else => { + try sema.resolveLazyValue(block, src, val); + return val; + }, }; } diff --git a/test/behavior/eval.zig b/test/behavior/eval.zig index 49183227b5..bc1c3628d7 100644 --- a/test/behavior/eval.zig +++ b/test/behavior/eval.zig @@ -1325,3 +1325,25 @@ test "value in if block is comptime known" { }; comptime try expect(std.mem.eql(u8, first, second)); } + +test "lazy sizeof is resolved in division" { + const A = struct { + a: u32, + }; + const a = 2; + try expect(@sizeOf(A) / a == 2); + try expect(@sizeOf(A) - a == 2); +} + +test "lazy value is resolved as slice operand" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + + const A = struct { a: u32 }; + var a: [512]u64 = undefined; + + const ptr1 = a[0..@sizeOf(A)]; + const ptr2 = @ptrCast([*]u8, &a)[0..@sizeOf(A)]; + try expect(@ptrToInt(ptr1) == @ptrToInt(ptr2)); + try expect(ptr1.len == ptr2.len); +}