zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 0bc5e7b5233acdc415e091c4a8c74433b7de2921 (tree)
parent 2703db3b405b45e897231e85ba884543d684f64f
Author: Veikka Tuominen <git@vexu.eu>
Date:   Sun, 14 May 2023 15:24:26 +0300

Sema: use `elemPtrOneLayerOnly` in `zirMemCpy`

Closes #15633

Diffstat:
Msrc/Sema.zig | 4++--
Mtest/behavior/memcpy.zig | 13+++++++++++++
2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -22146,7 +22146,7 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void const len = try sema.usizeCast(block, dest_src, len_u64); for (0..len) |i| { const elem_index = try sema.addIntUnsigned(Type.usize, i); - const dest_elem_ptr = try sema.elemPtr( + const dest_elem_ptr = try sema.elemPtrOneLayerOnly( block, src, dest_ptr, @@ -22155,7 +22155,7 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void true, // init false, // oob_safety ); - const src_elem_ptr = try sema.elemPtr( + const src_elem_ptr = try sema.elemPtrOneLayerOnly( block, src, src_ptr, diff --git a/test/behavior/memcpy.zig b/test/behavior/memcpy.zig @@ -65,3 +65,16 @@ fn testMemcpyDestManyPtr() !void { try expect(buf[3] == 'l'); try expect(buf[4] == 'o'); } + +comptime { + const S = struct { + buffer: [8]u8 = undefined, + fn set(self: *@This(), items: []const u8) void { + @memcpy(self.buffer[0..items.len], items); + } + }; + + var s = S{}; + s.set("hello"); + if (!std.mem.eql(u8, s.buffer[0..5], "hello")) @compileError("bad"); +}