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(...@@ -22625,7 +22625,9 @@ fn beginComptimePtrMutation(
22625 }22625 }
22626 },22626 },
22627 .opt_payload_ptr => {22627 .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 };
22629 var parent = try beginComptimePtrMutation(sema, block, src, opt_ptr.container_ptr, opt_ptr.container_ty);22631 var parent = try beginComptimePtrMutation(sema, block, src, opt_ptr.container_ptr, opt_ptr.container_ty);
22630 switch (parent.pointee) {22632 switch (parent.pointee) {
22631 .direct => |val_ptr| {22633 .direct => |val_ptr| {
...@@ -22941,7 +22943,7 @@ fn beginComptimePtrLoad(...@@ -22941,7 +22943,7 @@ fn beginComptimePtrLoad(
22941 if (coerce_in_mem_ok) {22943 if (coerce_in_mem_ok) {
22942 const payload_val = switch (ptr_val.tag()) {22944 const payload_val = switch (ptr_val.tag()) {
22943 .eu_payload_ptr => tv.val.castTag(.eu_payload).?.data,22945 .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,
22945 else => unreachable,22947 else => unreachable,
22946 };22948 };
22947 tv.* = TypedValue{ .ty = payload_ty, .val = payload_val };22949 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" {...@@ -1272,3 +1272,13 @@ test "continue nested in a conditional in an inline for" {
1272 }1272 }
1273 try expect(x == 0);1273 try expect(x == 0);
1274}1274}
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}