authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-22 00:28:08+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-22 11:16:36+03:00
logc1afe57d70606a20af42cb761b4919765295dcd4
tree4d9ea6008d5d2c91efe49a1fd8474b789f57e55f
parentb55a5007faad1de054e86e00bfdc9a58e5fc4ff8

Sema: resolve lazy values in `resolveMaybeUndefValIntable`

Closes #12512 Closes #12513

2 files changed, 26 insertions(+), 1 deletions(-)

src/Sema.zig+4-1
......@@ -1698,7 +1698,10 @@ fn resolveMaybeUndefValIntable(
16981698 .elem_ptr => check = check.castTag(.elem_ptr).?.data.array_ptr,
16991699 .eu_payload_ptr, .opt_payload_ptr => check = check.cast(Value.Payload.PayloadPtr).?.data.container_ptr,
17001700 .generic_poison => return error.GenericPoison,
1701 else => return val,
1701 else => {
1702 try sema.resolveLazyValue(block, src, val);
1703 return val;
1704 },
17021705 };
17031706}
17041707
test/behavior/eval.zig+22
......@@ -1325,3 +1325,25 @@ test "value in if block is comptime known" {
13251325 };
13261326 comptime try expect(std.mem.eql(u8, first, second));
13271327}
1328
1329test "lazy sizeof is resolved in division" {
1330 const A = struct {
1331 a: u32,
1332 };
1333 const a = 2;
1334 try expect(@sizeOf(A) / a == 2);
1335 try expect(@sizeOf(A) - a == 2);
1336}
1337
1338test "lazy value is resolved as slice operand" {
1339 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1340 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1341
1342 const A = struct { a: u32 };
1343 var a: [512]u64 = undefined;
1344
1345 const ptr1 = a[0..@sizeOf(A)];
1346 const ptr2 = @ptrCast([*]u8, &a)[0..@sizeOf(A)];
1347 try expect(@ptrToInt(ptr1) == @ptrToInt(ptr2));
1348 try expect(ptr1.len == ptr2.len);
1349}