From c619371ec1ae51d083703e187cae2d5b98c28741 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Fri, 22 Jul 2022 17:01:57 +0300 Subject: [PATCH] Sema: fix loading and storing of optional pointers represented as pointers --- src/Sema.zig | 6 ++++-- test/behavior/eval.zig | 10 ++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index 5889e3ecdb..e534a86aee 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -22625,7 +22625,9 @@ fn beginComptimePtrMutation( } }, .opt_payload_ptr => { - const opt_ptr = ptr_val.castTag(.opt_payload_ptr).?.data; + const opt_ptr = if (ptr_val.castTag(.opt_payload_ptr)) |some| some.data else { + return sema.beginComptimePtrMutation(block, src, ptr_val, try ptr_elem_ty.optionalChildAlloc(sema.arena)); + }; var parent = try beginComptimePtrMutation(sema, block, src, opt_ptr.container_ptr, opt_ptr.container_ty); switch (parent.pointee) { .direct => |val_ptr| { @@ -22941,7 +22943,7 @@ fn beginComptimePtrLoad( if (coerce_in_mem_ok) { const payload_val = switch (ptr_val.tag()) { .eu_payload_ptr => tv.val.castTag(.eu_payload).?.data, - .opt_payload_ptr => tv.val.castTag(.opt_payload).?.data, + .opt_payload_ptr => if (tv.val.castTag(.opt_payload)) |some| some.data else tv.val, else => unreachable, }; tv.* = TypedValue{ .ty = payload_ty, .val = payload_val }; diff --git a/test/behavior/eval.zig b/test/behavior/eval.zig index 6c86185afb..3286b812bf 100644 --- a/test/behavior/eval.zig +++ b/test/behavior/eval.zig @@ -1272,3 +1272,13 @@ test "continue nested in a conditional in an inline for" { } try expect(x == 0); } + +test "optional pointer represented as a pointer value" { + comptime { + var val: u8 = 15; + const opt_ptr: ?*u8 = &val; + + const payload_ptr = &opt_ptr.?; + try expect(payload_ptr.*.* == 15); + } +}