aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthew Lugg <mlugg@mlugg.co.uk>2024-10-07 13:46:21 +0100
committerGitHub <noreply@github.com>2024-10-07 13:46:21 +0100
commitea527f7a850f0200681630d8f36131eca31ef48b (patch)
tree70cf160373d67ad8ed5d46af78d91f5bc6bb5aaf /src
parent7a2fde973d27c7c47dc6eba174c71ae93af29d5f (diff)
parent95857d6b2180c1bc1009a0ebb173ba66d44c34f7 (diff)
downloadzig-ea527f7a850f0200681630d8f36131eca31ef48b.tar.gz
zig-ea527f7a850f0200681630d8f36131eca31ef48b.zip
Merge pull request #21618 from mlugg/validate-runtime-value
Sema: add a few missing runtime value validations
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index abd66f22fe..7060128e6d 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -2274,15 +2274,20 @@ pub fn resolveFinalDeclValue(
src: LazySrcLoc,
air_ref: Air.Inst.Ref,
) CompileError!Value {
+ const zcu = sema.pt.zcu;
+
const val = try sema.resolveValueAllowVariables(air_ref) orelse {
return sema.failWithNeededComptime(block, src, .{
.needed_comptime_reason = "global variable initializer must be comptime-known",
});
};
if (val.isGenericPoison()) return error.GenericPoison;
- if (val.canMutateComptimeVarState(sema.pt.zcu)) {
+
+ const init_val: Value = if (val.getVariable(zcu)) |v| .fromInterned(v.init) else val;
+ if (init_val.canMutateComptimeVarState(zcu)) {
return sema.fail(block, src, "global variable contains reference to comptime var", .{});
}
+
return val;
}
@@ -26193,6 +26198,8 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void
}
try sema.requireRuntimeBlock(block, src, runtime_src);
+ try sema.validateRuntimeValue(block, dest_src, dest_ptr);
+ try sema.validateRuntimeValue(block, src_src, src_ptr);
// Aliasing safety check.
if (block.wantSafety()) {
@@ -26321,6 +26328,9 @@ fn zirMemset(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void
};
try sema.requireRuntimeBlock(block, src, runtime_src);
+ try sema.validateRuntimeValue(block, dest_src, dest_ptr);
+ try sema.validateRuntimeValue(block, value_src, elem);
+
_ = try block.addInst(.{
.tag = if (block.wantSafety()) .memset_safe else .memset,
.data = .{ .bin_op = .{