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.
This commit is contained in:
mlugg 2023-09-14 22:52:09 +01:00
parent 6a349648cb
commit 50ef10eb49
No known key found for this signature in database
GPG Key ID: 58978E823BDE3EF9

View File

@ -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);
}