diff --git a/test/behavior.zig b/test/behavior.zig index 32be1951bcd7359632884683ca6b2108bd18a717..26333758086ae14904d9c275e4afcb55eb3176f7 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -60,6 +60,7 @@ test { _ = @import("behavior/nan.zig"); _ = @import("behavior/null.zig"); _ = @import("behavior/optional.zig"); + _ = @import("behavior/overlapping_assign.zig"); _ = @import("behavior/packed-struct.zig"); _ = @import("behavior/packed_struct_explicit_backing_int.zig"); _ = @import("behavior/packed-union.zig"); diff --git a/test/behavior/overlapping_assign.zig b/test/behavior/overlapping_assign.zig new file mode 100644 index 0000000000000000000000000000000000000000..7fcdb99aa8cfba0fc342e9ad7c17bc2a7b9eee49 --- /dev/null +++ b/test/behavior/overlapping_assign.zig @@ -0,0 +1,49 @@ +const std = @import("std"); +const expect = std.testing.expect; + +test "assignment to overlapping memory" { + try theTest(); + try comptime theTest(); +} + +fn theTest() !void { + var a1: [3]usize = .{ 0, 1, 2 }; + const b1: [3]usize = .{ 0, 0, 1 }; + a1[1..3].* = a1[0..2].*; + for (a1, b1) |a, b| { + try expect(a == b); + } + + var a2: [3]usize = .{ 0, 1, 2 }; + const b2: [3]usize = .{ 1, 2, 2 }; + a2[0..2].* = a2[1..3].*; + for (a2, b2) |a, b| { + try expect(a == b); + } + + var a3: [16]u8 = .{ + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + }; + const b3: [16]u8 = .{ + 0, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, + }; + a3[1..16].* = a3[0..15].*; + for (a3, b3) |a, b| { + try expect(a == b); + } + + var a4: [16]u8 = .{ + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + }; + const b4: [16]u8 = .{ + 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 15, + }; + a4[0..15].* = a4[1..16].*; + for (a4, b4) |a, b| { + try expect(a == b); + } +}