authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-22 17:01:57+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-22 17:03:42+03:00
logc619371ec1ae51d083703e187cae2d5b98c28741
tree62d25a881b1410d3935638a9a0610013865250b8
parent393d59bb721c2c8f0597d2b496e3721a809ae9fc

Sema: fix loading and storing of optional pointers represented as pointers


2 files changed, 14 insertions(+), 2 deletions(-)

src/Sema.zig+4-2
......@@ -22625,7 +22625,9 @@ fn beginComptimePtrMutation(
2262522625 }
2262622626 },
2262722627 .opt_payload_ptr => {
22628 const opt_ptr = ptr_val.castTag(.opt_payload_ptr).?.data;
22628 const opt_ptr = if (ptr_val.castTag(.opt_payload_ptr)) |some| some.data else {
22629 return sema.beginComptimePtrMutation(block, src, ptr_val, try ptr_elem_ty.optionalChildAlloc(sema.arena));
22630 };
2262922631 var parent = try beginComptimePtrMutation(sema, block, src, opt_ptr.container_ptr, opt_ptr.container_ty);
2263022632 switch (parent.pointee) {
2263122633 .direct => |val_ptr| {
......@@ -22941,7 +22943,7 @@ fn beginComptimePtrLoad(
2294122943 if (coerce_in_mem_ok) {
2294222944 const payload_val = switch (ptr_val.tag()) {
2294322945 .eu_payload_ptr => tv.val.castTag(.eu_payload).?.data,
22944 .opt_payload_ptr => tv.val.castTag(.opt_payload).?.data,
22946 .opt_payload_ptr => if (tv.val.castTag(.opt_payload)) |some| some.data else tv.val,
2294522947 else => unreachable,
2294622948 };
2294722949 tv.* = TypedValue{ .ty = payload_ty, .val = payload_val };
test/behavior/eval.zig+10
......@@ -1272,3 +1272,13 @@ test "continue nested in a conditional in an inline for" {
12721272 }
12731273 try expect(x == 0);
12741274}
1275
1276test "optional pointer represented as a pointer value" {
1277 comptime {
1278 var val: u8 = 15;
1279 const opt_ptr: ?*u8 = &val;
1280
1281 const payload_ptr = &opt_ptr.?;
1282 try expect(payload_ptr.*.* == 15);
1283 }
1284}