1const builtin = @import("builtin");
2const std = @import("std");
3const expect = std.testing.expect;
4
5test "assignment to overlapping memory" {
6 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
7
8 try theTest();
9 try comptime theTest();
10}
11
12fn theTest() !void {
13 var a1: [3]usize = .{ 0, 1, 2 };
14 const b1: [3]usize = .{ 0, 0, 1 };
15 a1[1..3].* = a1[0..2].*;
16 for (a1, b1) |a, b| {
17 try expect(a == b);
18 }
19
20 var a2: [3]usize = .{ 0, 1, 2 };
21 const b2: [3]usize = .{ 1, 2, 2 };
22 a2[0..2].* = a2[1..3].*;
23 for (a2, b2) |a, b| {
24 try expect(a == b);
25 }
26
27 var a3: [16]u8 = .{
28 0, 1, 2, 3, 4, 5, 6, 7,
29 8, 9, 10, 11, 12, 13, 14, 15,
30 };
31 const b3: [16]u8 = .{
32 0, 0, 1, 2, 3, 4, 5, 6,
33 7, 8, 9, 10, 11, 12, 13, 14,
34 };
35 a3[1..16].* = a3[0..15].*;
36 for (a3, b3) |a, b| {
37 try expect(a == b);
38 }
39
40 var a4: [16]u8 = .{
41 0, 1, 2, 3, 4, 5, 6, 7,
42 8, 9, 10, 11, 12, 13, 14, 15,
43 };
44 const b4: [16]u8 = .{
45 1, 2, 3, 4, 5, 6, 7, 8,
46 9, 10, 11, 12, 13, 14, 15, 15,
47 };
48 a4[0..15].* = a4[1..16].*;
49 for (a4, b4) |a, b| {
50 try expect(a == b);
51 }
52}