diff options
| author | mlugg <mlugg@mlugg.co.uk> | 2023-08-21 01:35:35 +0100 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2023-08-21 11:30:20 -0700 |
| commit | 82c8e45a7e7659146b2ecda2929f01027b0658e4 (patch) | |
| tree | ade5d06f4eddc3270527423c836cbcc04959b3db /src/Sema.zig | |
| parent | 60fc18bd1c154f3c728a147c4574b5db8a17f08e (diff) | |
| download | zig-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.zig | 21 |
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); |
