authorgravatar for chrisjkappel@gmail.comc-kappel <chrisjkappel@gmail.com> 2026-08-31 11:50:41+02:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2026-08-31 11:50:41+02:00
logfd3048c5a91220102420ef51ba5193d6febca521
tree8d368751dc1d7b28079ed0beceb2b96ec4de4f02
parent749ed5fc7f4afd7a42830f77f69245f1abcdd9a0

Sema: prevent reference to comptime memory at runtime (#36480)

Co-authored-by: c-kappel <kcapcode@gmail.com> Reviewed-on: https://codeberg.org/ziglang/zig/pulls/36480

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

src/Sema.zig+10-2
......@@ -29933,7 +29933,7 @@ fn storePtr2(
2993329933 // We're performing the store at runtime, so the pointee type must not be comptime-only.
2993429934 if (comptime_only) return sema.failWithOwnedErrorMsg(block, msg: {
2993529935 const msg = try sema.errMsg(src, "cannot store comptime-only type '{f}' at runtime", .{elem_ty.fmt(pt)});
29936 errdefer msg.destroy(sema.gpa);
29936 errdefer msg.destroy(zcu.gpa);
2993729937 try sema.errNote(ptr_src, msg, "operation is runtime due to this pointer", .{});
2993829938 break :msg msg;
2993929939 });
......@@ -29957,10 +29957,18 @@ fn storePtr2(
2995729957fn checkComptimeKnownStore(sema: *Sema, block: *Block, store_inst_ref: Air.Inst.Ref, store_src: LazySrcLoc) !void {
2995829958 const store_inst = store_inst_ref.toIndex().?;
2995929959 const inst_data = sema.air_instructions.items(.data)[@backingInt(store_inst)].bin_op;
29960 const ptr = inst_data.lhs.toIndex() orelse return;
2996129960 const operand = inst_data.rhs;
2996229961
2996329962 known: {
29963 const ptr = inst_data.lhs.toIndex() orelse {
29964 const ptr_val: Value = .fromInterned(inst_data.lhs.toInterned().?);
29965 if (sema.isComptimeMutablePtr(ptr_val)) {
29966 return;
29967 } else {
29968 break :known;
29969 }
29970 };
29971
2996429972 const maybe_base_alloc = sema.base_allocs.get(ptr) orelse break :known;
2996529973 const maybe_comptime_alloc = sema.maybe_comptime_allocs.getPtr(maybe_base_alloc) orelse break :known;
2996629974
test/cases/compile_errors/comptime_var_referenced_at_runtime.zig+9
......@@ -77,6 +77,12 @@ export fn qoo(i: u8) void {
7777 _ = y;
7878}
7979
80var runtimeP: *bool = undefined;
81export fn qaz() void {
82 comptime var b = true;
83 runtimeP = &b;
84}
85
8086// error
8187//
8288// :5:19: error: runtime value contains reference to comptime var
......@@ -112,3 +118,6 @@ export fn qoo(i: u8) void {
112118// :76:19: error: runtime value contains reference to comptime var
113119// :76:19: note: comptime var pointers are not available at runtime
114120// :75:14: note: 'runtime_value' points to comptime var declared here
121// :83:16: error: runtime value contains reference to comptime var
122// :83:16: note: comptime var pointers are not available at runtime
123// :82:22: note: 'runtime_value' points to comptime var declared here