authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-10-09 08:46:20+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-10-10 08:36:07+02:00
log40a50f5e2cd4900d2b3d13b353b18a8b6ae052af
tree3eb5861ab1b461c6ea52a764f39a1c545a3b3dd1
parent47a2437afb3c392771eed8a26aac1bb3c84963af
signature Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

test: move issue_12706 from test-standalone to test-c-abi


6 files changed, 22 insertions(+), 56 deletions(-)

test/c_abi/cfuncs.c+11
......@@ -1,6 +1,7 @@
11#include <complex.h>
22#include <inttypes.h>
33#include <stdalign.h>
4#include <stdarg.h>
45#include <stdbool.h>
56#include <stdlib.h>
67#include <string.h>
......@@ -16775,6 +16776,16 @@ void c_x86_64_sysv_uint_int_uint_int(unsigned a, int b, unsigned c, int d) {
1677516776 assert_or_panic(d == -4);
1677616777}
1677716778
16779void c_varargs_fn_ptr(int n, ...) {
16780 assert_or_panic(n == 2);
16781 va_list ap;
16782 va_start(ap, n);
16783 void (*fn_ptr)(int) = va_arg(ap, void (*)(int));
16784 int arg = va_arg(ap, int);
16785 va_end(ap);
16786 fn_ptr(arg);
16787}
16788
1677816789void c_win64_varargs_u64_f64_u64_f64(uint64_t a, double b, uint64_t c, double d) {
1677916790 assert_or_panic(a == UINT64_C(0x3ff0000000000000));
1678016791 assert_or_panic(b == 2.0);
test/c_abi/main.zig+11
......@@ -18009,6 +18009,17 @@ test "x86_64 sysv args" {
1800918009 c_x86_64_sysv_uint_int_uint_int(1, -2, 3, -4);
1801018010}
1801118011
18012extern fn c_varargs_fn_ptr(n: c_int, ...) void;
18013
18014fn zigVaCb(x: c_int) callconv(.c) void {
18015 expect(x == 123) catch @panic("test failure: zigVaCb");
18016}
18017
18018test "function pointer through varargs" {
18019 // Bare function (not `&`), as in the original #12706 repro.
18020 c_varargs_fn_ptr(2, zigVaCb, @as(c_int, 123));
18021}
18022
1801218023extern fn c_win64_varargs_u64_f64_u64_f64(...) void;
1801318024extern fn c_win64_varargs_f64_u64_f64_u64(...) void;
1801418025
test/standalone/build.zig.zon-3
......@@ -126,9 +126,6 @@
126126 .c_embed_path = .{
127127 .path = "c_embed_path",
128128 },
129 .issue_12706 = .{
130 .path = "issue_12706",
131 },
132129 .coff_dwarf = .{
133130 .path = "coff_dwarf",
134131 },
test/standalone/issue_12706/build.zig deleted-30
......@@ -1,30 +0,0 @@
1const std = @import("std");
2const builtin = @import("builtin");
3
4pub fn build(b: *std.Build) void {
5 const test_step = b.step("test", "Test it");
6 b.default_step = test_step;
7
8 const optimize: std.builtin.Optimize = .debug;
9 const target = b.graph.host;
10
11 const exe = b.addExecutable(.{
12 .name = "main",
13 .root_module = b.createModule(.{
14 .root_source_file = b.path("main.zig"),
15 .optimize = optimize,
16 .target = target,
17 }),
18 });
19
20 const c_sources = [_][]const u8{
21 "test.c",
22 };
23 exe.root_module.addCSourceFiles(.{ .files = &c_sources });
24 exe.root_module.link_libc = true;
25
26 const run_cmd = b.addRunArtifact(exe);
27 run_cmd.expectExitCode(0);
28 run_cmd.skip_foreign_checks = true;
29 test_step.dependOn(&run_cmd.step);
30}
test/standalone/issue_12706/main.zig deleted-12
......@@ -1,12 +0,0 @@
1const std = @import("std");
2extern fn testFnPtr(n: c_int, ...) void;
3
4const val: c_int = 123;
5
6fn func(a: c_int) callconv(.c) void {
7 std.debug.assert(a == val);
8}
9
10pub fn main() void {
11 testFnPtr(2, func, val);
12}
test/standalone/issue_12706/test.c deleted-11
......@@ -1,11 +0,0 @@
1#include <stdarg.h>
2
3void testFnPtr(int n, ...) {
4 va_list ap;
5 va_start(ap, n);
6
7 void (*fnPtr)(int) = va_arg(ap, void (*)(int));
8 int arg = va_arg(ap, int);
9 fnPtr(arg);
10 va_end(ap);
11}
\ No newline at end of file