diff options
| author | mlugg <mlugg@mlugg.co.uk> | 2023-09-14 22:52:09 +0100 |
|---|---|---|
| committer | mlugg <mlugg@mlugg.co.uk> | 2023-09-15 14:29:57 +0100 |
| commit | 50ef10eb4963167225f7153dc5165292dbac0046 (patch) | |
| tree | d6cb9b5028c9b38f867c648fef7c16299fab4990 /src/Sema.zig | |
| parent | 6a349648cb29b3e624dfffcc412c4249c0e19d9f (diff) | |
| download | zig-50ef10eb4963167225f7153dc5165292dbac0046.tar.gz zig-50ef10eb4963167225f7153dc5165292dbac0046.zip | |
Sema: add missing compile error for runtime-known const with comptime-only type
When RLS is used to initialize a value with a comptime-only type, the
usual "value with comptime-only type depends on runtime control flow"
error message isn't hit, because we don't use results from a block. When
we reach `make_ptr_const`, we must validate that the value is
comptime-known.
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 06f75a4a14..3fb425ffa7 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -3780,6 +3780,21 @@ fn zirMakePtrConst(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro return sema.analyzeDeclRef(try anon_decl.finish(elem_ty, store_val, ptr_info.flags.alignment)); } + // If this is already a comptime-mutable allocation, we don't want to emit an error - the stores + // were already performed at comptime! Just make the pointer constant as normal. + implicit_ct: { + const ptr_val = try sema.resolveMaybeUndefVal(alloc) orelse break :implicit_ct; + if (ptr_val.isComptimeMutablePtr(mod)) break :implicit_ct; + return sema.makePtrConst(block, alloc); + } + + if (try sema.typeRequiresComptime(elem_ty)) { + // The value was initialized through RLS, so we didn't detect the runtime condition earlier. + // TODO: source location of runtime control flow + const init_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node }; + return sema.fail(block, init_src, "value with comptime-only type '{}' depends on runtime control flow", .{elem_ty.fmt(mod)}); + } + return sema.makePtrConst(block, alloc); } |
