diff --git a/src/Sema.zig b/src/Sema.zig index e534a86aee481d2d43fbfc201e3739c965f50279..76b5dcb8c0bcd9fe3e154a860c45dc38859c45bc 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -22660,7 +22660,11 @@ fn beginComptimePtrMutation( .ty = payload_ty, }, - else => unreachable, + else => return ComptimePtrMutationKit{ + .decl_ref_mut = parent.decl_ref_mut, + .pointee = .{ .direct = val_ptr }, + .ty = payload_ty, + }, } }, .bad_decl_ty, .bad_ptr_ty => return parent, diff --git a/test/behavior/eval.zig b/test/behavior/eval.zig index 3286b812bf0984b35ed37bcf7b65f5bf7488b7d0..d2a75e18dfe158c4880f832d754c6d1b307f51a9 100644 --- a/test/behavior/eval.zig +++ b/test/behavior/eval.zig @@ -1282,3 +1282,14 @@ test "optional pointer represented as a pointer value" { try expect(payload_ptr.*.* == 15); } } + +test "mutate through pointer-like optional at comptime" { + comptime { + var val: u8 = 15; + var opt_ptr: ?*const u8 = &val; + + const payload_ptr = &opt_ptr.?; + payload_ptr.* = &@as(u8, 16); + try expect(payload_ptr.*.* == 16); + } +}