diff options
| author | Matthew Lugg <mlugg@mlugg.co.uk> | 2024-10-07 13:46:21 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-07 13:46:21 +0100 |
| commit | ea527f7a850f0200681630d8f36131eca31ef48b (patch) | |
| tree | 70cf160373d67ad8ed5d46af78d91f5bc6bb5aaf /src | |
| parent | 7a2fde973d27c7c47dc6eba174c71ae93af29d5f (diff) | |
| parent | 95857d6b2180c1bc1009a0ebb173ba66d44c34f7 (diff) | |
| download | zig-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.zig | 12 |
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 = .{ |
