authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-05-24 13:14:16+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-05-24 14:29:15+03:00
logb2a514b3d2d2d880a41a26e798fb3c9ee014c229
tree9aa31eaef54e46d112b426dbedc0de286885fe48
parent16dbb960fc8dada79cd42dd2ba1ebf0f66ccaaec

Sema: `@memcpy` convert src slice to many ptr

Closes #15838

2 files changed, 6 insertions(+), 1 deletions(-)

src/Sema.zig+4
......@@ -22235,6 +22235,10 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void
2223522235 // Change the dest to a slice, since its type must have the length.
2223622236 const dest_ptr_ptr = try sema.analyzeRef(block, dest_src, new_dest_ptr);
2223722237 new_dest_ptr = try sema.analyzeSlice(block, dest_src, dest_ptr_ptr, .zero, src_len, .none, .unneeded, dest_src, dest_src, dest_src, false);
22238 const new_src_ptr_ty = sema.typeOf(new_src_ptr);
22239 if (new_src_ptr_ty.isSlice()) {
22240 new_src_ptr = try sema.analyzeSlicePtr(block, src_src, new_src_ptr, new_src_ptr_ty);
22241 }
2223822242 }
2223922243
2224022244 try sema.requireRuntimeBlock(block, src, runtime_src);
test/behavior/memcpy.zig+2-1
......@@ -58,7 +58,8 @@ test "@memcpy dest many pointer" {
5858fn testMemcpyDestManyPtr() !void {
5959 var str = "hello".*;
6060 var buf: [5]u8 = undefined;
61 @memcpy(@ptrCast([*]u8, &buf), @ptrCast([*]const u8, &str)[0..5]);
61 var len: usize = 5;
62 @memcpy(@ptrCast([*]u8, &buf), @ptrCast([*]const u8, &str)[0..len]);
6263 try expect(buf[0] == 'h');
6364 try expect(buf[1] == 'e');
6465 try expect(buf[2] == 'l');