authorgravatar for techatrix@mailbox.orgTechatrix <techatrix@mailbox.org> 2026-08-03 21:02:56+02:00
committergravatar for techatrix@mailbox.orgTechatrix <techatrix@mailbox.org> 2026-08-05 15:27:02+02:00
log6f7607c8e23fd8fd5d8fdbc28b119590f092dd0b
tree56d7682f1d93ad32b9d694be5a941cf3483be1a3
parentc80045cbe77c9cd044ab07b189003726169e0ace
signaturebadge-check Signed by SSH key SHA256:HYC3SjXQcAt6uwv9pu/6OoVQ2rUH8rb5zKiUHSe9uxk

c_abi: fix struct with single scalar array element on wasm


2 files changed, 19 insertions(+), 31 deletions(-)

src/codegen/wasm/abi.zig+7
......@@ -84,6 +84,13 @@ pub fn classifyTypeForLlvm(ty: Type, zcu: *const Zcu) LlvmClass {
8484 if (explicit_align.compareStrict(.gt, field_ty.abiAlignment(zcu)))
8585 return .indirect;
8686 }
87 if (field_ty.zigTypeTag(zcu) == .array) {
88 switch (field_ty.arrayLenIncludingSentinel(zcu)) {
89 0 => unreachable,
90 1 => return classifyTypeForLlvm(field_ty.childType(zcu), zcu),
91 else => {},
92 }
93 }
8794 return classifyTypeForLlvm(field_ty, zcu);
8895 },
8996 .@"union" => {
test/c_abi/main.zig+12-31
......@@ -16107,20 +16107,12 @@ const Struct_array_1_f32 = extern struct {
1610716107 a: [1]f32,
1610816108};
1610916109
16110comptime {
16111 skip: {
16112 if (builtin.cpu.arch.isWasm()) break :skip;
16113
16114 _ = struct {
16115 export fn zig_ret_struct_array_1_f32() Struct_array_1_f32 {
16116 return .{ .a = .{1} };
16117 }
16118 export fn zig_struct_array_1_f32(s: Struct_array_1_f32, i: usize) void {
16119 expect(s.a[0] == 2) catch @panic("test failure");
16120 expect(i == 3) catch @panic("test failure");
16121 }
16122 };
16123 }
16110export fn zig_ret_struct_array_1_f32() Struct_array_1_f32 {
16111 return .{ .a = .{1} };
16112}
16113export fn zig_struct_array_1_f32(s: Struct_array_1_f32, i: usize) void {
16114 expect(s.a[0] == 2) catch @panic("test failure");
16115 expect(i == 3) catch @panic("test failure");
1612416116}
1612516117
1612616118extern fn c_ret_struct_array_1_f32() Struct_array_1_f32;
......@@ -16134,7 +16126,6 @@ test "struct [1]f32" {
1613416126 if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest;
1613516127 if (builtin.cpu.arch.isRISCV()) return error.SkipZigTest;
1613616128 if (builtin.cpu.arch == .s390x) return error.SkipZigTest;
16137 if (builtin.cpu.arch.isWasm()) return error.SkipZigTest;
1613816129
1613916130 const s = c_ret_struct_array_1_f32();
1614016131 try expect(s.a[0] == 4);
......@@ -16303,7 +16294,6 @@ test "struct [0:sentinel]f32" {
1630316294 if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest;
1630416295 if (builtin.cpu.arch.isRISCV()) return error.SkipZigTest;
1630516296 if (builtin.cpu.arch == .s390x) return error.SkipZigTest;
16306 if (builtin.cpu.arch.isWasm()) return error.SkipZigTest;
1630716297
1630816298 var sentinel_index: usize = 0;
1630916299 _ = &sentinel_index;
......@@ -16766,20 +16756,12 @@ const Struct_array_1_f64 = extern struct {
1676616756 a: [1]f64,
1676716757};
1676816758
16769comptime {
16770 skip: {
16771 if (builtin.cpu.arch.isWasm()) break :skip;
16772
16773 _ = struct {
16774 export fn zig_ret_struct_array_1_f64() Struct_array_1_f64 {
16775 return .{ .a = .{1} };
16776 }
16777 export fn zig_struct_array_1_f64(s: Struct_array_1_f64, i: usize) void {
16778 expect(s.a[0] == 2) catch @panic("test failure");
16779 expect(i == 3) catch @panic("test failure");
16780 }
16781 };
16782 }
16759export fn zig_ret_struct_array_1_f64() Struct_array_1_f64 {
16760 return .{ .a = .{1} };
16761}
16762export fn zig_struct_array_1_f64(s: Struct_array_1_f64, i: usize) void {
16763 expect(s.a[0] == 2) catch @panic("test failure");
16764 expect(i == 3) catch @panic("test failure");
1678316765}
1678416766
1678516767extern fn c_ret_struct_array_1_f64() Struct_array_1_f64;
......@@ -16793,7 +16775,6 @@ test "struct [1]f64" {
1679316775 if (builtin.cpu.arch.isPowerPC()) return error.SkipZigTest;
1679416776 if (builtin.cpu.arch.isRISCV()) return error.SkipZigTest;
1679516777 if (builtin.cpu.arch == .s390x) return error.SkipZigTest;
16796 if (builtin.cpu.arch.isWasm()) return error.SkipZigTest;
1679716778
1679816779 const s = c_ret_struct_array_1_f64();
1679916780 try expect(s.a[0] == 4);