authorgravatar for goon.pri.low@gmail.comKendall Condon <goon.pri.low@gmail.com> 2026-03-23 18:47:56-04:00
committergravatar for goon.pri.low@gmail.comKendall Condon <goon.pri.low@gmail.com> 2026-03-25 17:27:18-04:00
logebca8c2dbba5b4c0db9910d4cbd854d679114a8d
tree0b4e5a6933027400adccce4cb572a6b9d9666a3a
parent54b3484256695381c034aa30f322b1499a4b27c8

x86_64: fix runtime array concat with comptime slice


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

src/codegen/x86_64/CodeGen.zig+1
...@@ -170801,6 +170801,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {...@@ -170801,6 +170801,7 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void {
170801 else => |e| return e,170801 else => |e| return e,
170802 };170802 };
170803 try ops[0].toSlicePtr(cg);170803 try ops[0].toSlicePtr(cg);
170804 try ops[1].toSlicePtr(cg);
170804 cg.select(&.{}, &.{}, &ops, switch (air_tag) {170805 cg.select(&.{}, &.{}, &ops, switch (air_tag) {
170805 else => unreachable,170806 else => unreachable,
170806 inline .memcpy, .memmove => |symbol| comptime &.{.{170807 inline .memcpy, .memmove => |symbol| comptime &.{.{
test/behavior/array.zig+12
...@@ -45,6 +45,18 @@ fn getArrayLen(a: []const u32) usize {...@@ -45,6 +45,18 @@ fn getArrayLen(a: []const u32) usize {
45 return a.len;45 return a.len;
46}46}
4747
48test "runtime array concat with comptime slice" {
49 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
50 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
51 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
52
53 var a: [1]u8 = .{1};
54 const b = (comptime @as([]const u8, &.{0})) ++ &a;
55 const c = &a ++ (comptime @as([]const u8, &.{0}));
56 try std.testing.expectEqualSlices(u8, &.{ 0, 1 }, b);
57 try std.testing.expectEqualSlices(u8, &.{ 1, 0 }, c);
58}
59
48test "array concat with undefined" {60test "array concat with undefined" {
49 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO61 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
50 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;62 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;