diff --git a/src/Sema.zig b/src/Sema.zig index deef97115e3590c4f94e71c47d2b899030bcb7db..d828999ddf32555ef39dd3fe936d88389fa8e9ea 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -29933,7 +29933,7 @@ fn storePtr2( // We're performing the store at runtime, so the pointee type must not be comptime-only. if (comptime_only) return sema.failWithOwnedErrorMsg(block, msg: { const msg = try sema.errMsg(src, "cannot store comptime-only type '{f}' at runtime", .{elem_ty.fmt(pt)}); - errdefer msg.destroy(sema.gpa); + errdefer msg.destroy(zcu.gpa); try sema.errNote(ptr_src, msg, "operation is runtime due to this pointer", .{}); break :msg msg; }); @@ -29957,10 +29957,18 @@ fn storePtr2( fn checkComptimeKnownStore(sema: *Sema, block: *Block, store_inst_ref: Air.Inst.Ref, store_src: LazySrcLoc) !void { const store_inst = store_inst_ref.toIndex().?; const inst_data = sema.air_instructions.items(.data)[@backingInt(store_inst)].bin_op; - const ptr = inst_data.lhs.toIndex() orelse return; const operand = inst_data.rhs; known: { + const ptr = inst_data.lhs.toIndex() orelse { + const ptr_val: Value = .fromInterned(inst_data.lhs.toInterned().?); + if (sema.isComptimeMutablePtr(ptr_val)) { + return; + } else { + break :known; + } + }; + const maybe_base_alloc = sema.base_allocs.get(ptr) orelse break :known; const maybe_comptime_alloc = sema.maybe_comptime_allocs.getPtr(maybe_base_alloc) orelse break :known; diff --git a/test/cases/compile_errors/comptime_var_referenced_at_runtime.zig b/test/cases/compile_errors/comptime_var_referenced_at_runtime.zig index 897c298e6181ff75fd866370674e0ea769f7ae2c..6c3f052504b94d6db93d9f34b1d9ac19fccfaf6a 100644 --- a/test/cases/compile_errors/comptime_var_referenced_at_runtime.zig +++ b/test/cases/compile_errors/comptime_var_referenced_at_runtime.zig @@ -77,6 +77,12 @@ export fn qoo(i: u8) void { _ = y; } +var runtimeP: *bool = undefined; +export fn qaz() void { + comptime var b = true; + runtimeP = &b; +} + // error // // :5:19: error: runtime value contains reference to comptime var @@ -112,3 +118,6 @@ export fn qoo(i: u8) void { // :76:19: error: runtime value contains reference to comptime var // :76:19: note: comptime var pointers are not available at runtime // :75:14: note: 'runtime_value' points to comptime var declared here +// :83:16: error: runtime value contains reference to comptime var +// :83:16: note: comptime var pointers are not available at runtime +// :82:22: note: 'runtime_value' points to comptime var declared here