aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authormlugg <mlugg@mlugg.co.uk>2023-08-21 01:35:35 +0100
committerAndrew Kelley <andrew@ziglang.org>2023-08-21 11:30:20 -0700
commit82c8e45a7e7659146b2ecda2929f01027b0658e4 (patch)
treeade5d06f4eddc3270527423c836cbcc04959b3db /src/Sema.zig
parent60fc18bd1c154f3c728a147c4574b5db8a17f08e (diff)
downloadzig-82c8e45a7e7659146b2ecda2929f01027b0658e4.tar.gz
zig-82c8e45a7e7659146b2ecda2929f01027b0658e4.zip
Sema: check @memset operand provides length
Resolves: #16698
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index c1f7eb2268..b4dd9fbd66 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -23938,7 +23938,26 @@ fn zirMemset(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void
return sema.fail(block, dest_src, "cannot memset constant pointer", .{});
}
- const dest_elem_ty = dest_ptr_ty.elemType2(mod);
+ const dest_elem_ty: Type = dest_elem_ty: {
+ const ptr_info = dest_ptr_ty.ptrInfo(mod);
+ switch (ptr_info.flags.size) {
+ .Slice => break :dest_elem_ty ptr_info.child.toType(),
+ .One => {
+ if (ptr_info.child.toType().zigTypeTag(mod) == .Array) {
+ break :dest_elem_ty ptr_info.child.toType().childType(mod);
+ }
+ },
+ .Many, .C => {},
+ }
+ return sema.failWithOwnedErrorMsg(msg: {
+ const msg = try sema.errMsg(block, src, "unknown @memset length", .{});
+ errdefer msg.destroy(sema.gpa);
+ try sema.errNote(block, dest_src, msg, "destination type '{}' provides no length", .{
+ dest_ptr_ty.fmt(mod),
+ });
+ break :msg msg;
+ });
+ };
const runtime_src = if (try sema.resolveDefinedValue(block, dest_src, dest_ptr)) |ptr_val| rs: {
const len_air_ref = try sema.fieldVal(block, src, dest_ptr, try ip.getOrPutString(gpa, "len"), dest_src);