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...@@ -22235,6 +22235,10 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void
22235 // Change the dest to a slice, since its type must have the length.22235 // Change the dest to a slice, since its type must have the length.
22236 const dest_ptr_ptr = try sema.analyzeRef(block, dest_src, new_dest_ptr);22236 const dest_ptr_ptr = try sema.analyzeRef(block, dest_src, new_dest_ptr);
22237 new_dest_ptr = try sema.analyzeSlice(block, dest_src, dest_ptr_ptr, .zero, src_len, .none, .unneeded, dest_src, dest_src, dest_src, false);22237 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 }
22238 }22242 }
2223922243
22240 try sema.requireRuntimeBlock(block, src, runtime_src);22244 try sema.requireRuntimeBlock(block, src, runtime_src);
test/behavior/memcpy.zig+2-1
...@@ -58,7 +58,8 @@ test "@memcpy dest many pointer" {...@@ -58,7 +58,8 @@ test "@memcpy dest many pointer" {
58fn testMemcpyDestManyPtr() !void {58fn testMemcpyDestManyPtr() !void {
59 var str = "hello".*;59 var str = "hello".*;
60 var buf: [5]u8 = undefined;60 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]);
62 try expect(buf[0] == 'h');63 try expect(buf[0] == 'h');
63 try expect(buf[1] == 'e');64 try expect(buf[1] == 'e');
64 try expect(buf[2] == 'l');65 try expect(buf[2] == 'l');