authorgravatar for justusk@noreply.codeberg.orgJustus Klausecker <justusk@noreply.codeberg.org> 2026-06-29 11:31:49+02:00
committergravatar for justusk@noreply.codeberg.orgJustus Klausecker <justusk@noreply.codeberg.org> 2026-06-29 11:31:49+02:00
log4c9d06416c1f0e4e7bf5139a705c50ad18f9c39a
tree8ef3477cf5c71ca4f0aa5bf93c20794616379d8f
parent175589fc713d0c706812508fb6bb566b77423b83
parenteab71c7c86d1dfc7e2016387c9edbeae5dcfcbf7

Merge pull request 'Test coverage for overlapping assignments' (#35918) from Fri3dNstuff/zig:overlapping-copy into master

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/35918 Reviewed-by: Justus Klausecker <justusk@noreply.codeberg.org>

2 files changed, 50 insertions(+), 0 deletions(-)

test/behavior.zig+1
...@@ -60,6 +60,7 @@ test {...@@ -60,6 +60,7 @@ test {
60 _ = @import("behavior/nan.zig");60 _ = @import("behavior/nan.zig");
61 _ = @import("behavior/null.zig");61 _ = @import("behavior/null.zig");
62 _ = @import("behavior/optional.zig");62 _ = @import("behavior/optional.zig");
63 _ = @import("behavior/overlapping_assign.zig");
63 _ = @import("behavior/packed-struct.zig");64 _ = @import("behavior/packed-struct.zig");
64 _ = @import("behavior/packed_struct_explicit_backing_int.zig");65 _ = @import("behavior/packed_struct_explicit_backing_int.zig");
65 _ = @import("behavior/packed-union.zig");66 _ = @import("behavior/packed-union.zig");
test/behavior/overlapping_assign.zig created+49
...@@ -0,0 +1,49 @@
1const std = @import("std");
2const expect = std.testing.expect;
3
4test "assignment to overlapping memory" {
5 try theTest();
6 try comptime theTest();
7}
8
9fn theTest() !void {
10 var a1: [3]usize = .{ 0, 1, 2 };
11 const b1: [3]usize = .{ 0, 0, 1 };
12 a1[1..3].* = a1[0..2].*;
13 for (a1, b1) |a, b| {
14 try expect(a == b);
15 }
16
17 var a2: [3]usize = .{ 0, 1, 2 };
18 const b2: [3]usize = .{ 1, 2, 2 };
19 a2[0..2].* = a2[1..3].*;
20 for (a2, b2) |a, b| {
21 try expect(a == b);
22 }
23
24 var a3: [16]u8 = .{
25 0, 1, 2, 3, 4, 5, 6, 7,
26 8, 9, 10, 11, 12, 13, 14, 15,
27 };
28 const b3: [16]u8 = .{
29 0, 0, 1, 2, 3, 4, 5, 6,
30 7, 8, 9, 10, 11, 12, 13, 14,
31 };
32 a3[1..16].* = a3[0..15].*;
33 for (a3, b3) |a, b| {
34 try expect(a == b);
35 }
36
37 var a4: [16]u8 = .{
38 0, 1, 2, 3, 4, 5, 6, 7,
39 8, 9, 10, 11, 12, 13, 14, 15,
40 };
41 const b4: [16]u8 = .{
42 1, 2, 3, 4, 5, 6, 7, 8,
43 9, 10, 11, 12, 13, 14, 15, 15,
44 };
45 a4[0..15].* = a4[1..16].*;
46 for (a4, b4) |a, b| {
47 try expect(a == b);
48 }
49}