diff --git a/src/Sema.zig b/src/Sema.zig index dd492e5394..ee9fa5b062 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -24311,7 +24311,8 @@ fn analyzeMinMax( fn upgradeToArrayPtr(sema: *Sema, block: *Block, ptr: Air.Inst.Ref, len: u64) !Air.Inst.Ref { const mod = sema.mod; - const info = sema.typeOf(ptr).ptrInfo(mod); + const ptr_ty = sema.typeOf(ptr); + const info = ptr_ty.ptrInfo(mod); if (info.flags.size == .One) { // Already an array pointer. return ptr; @@ -24330,10 +24331,11 @@ fn upgradeToArrayPtr(sema: *Sema, block: *Block, ptr: Air.Inst.Ref, len: u64) !A .address_space = info.flags.address_space, }, }); - if (info.flags.size == .Slice) { - return block.addTyOp(.slice_ptr, new_ty, ptr); - } - return block.addBitCast(new_ty, ptr); + const non_slice_ptr = if (info.flags.size == .Slice) + try block.addTyOp(.slice_ptr, ptr_ty.slicePtrFieldType(mod), ptr) + else + ptr; + return block.addBitCast(new_ty, non_slice_ptr); } fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void { diff --git a/test/behavior/memcpy.zig b/test/behavior/memcpy.zig index 33f6c0f34c..fa9203713d 100644 --- a/test/behavior/memcpy.zig +++ b/test/behavior/memcpy.zig @@ -66,6 +66,27 @@ fn testMemcpyDestManyPtr() !void { try expect(buf[4] == 'o'); } +test "@memcpy slice" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; + + try testMemcpySlice(); + try comptime testMemcpySlice(); +} + +fn testMemcpySlice() !void { + var buf: [5]u8 = undefined; + const dst: []u8 = &buf; + const src: []const u8 = "hello"; + @memcpy(dst, src); + try expect(buf[0] == 'h'); + try expect(buf[1] == 'e'); + try expect(buf[2] == 'l'); + try expect(buf[3] == 'l'); + try expect(buf[4] == 'o'); +} + comptime { const S = struct { buffer: [8]u8 = undefined,