// Pure-sx fn-pointer cast: a function-pointer typed without `callconv(.c)` // keeps the default (sx) calling convention. Passing a >16-byte aggregate // through that pointer must not get the C-ABI byval coercion — the sx-CC // callee expects the struct as an SSA value, not as a `ptr byval()`. // // Pair with examples/86-callconv-c-fnptr-large-aggregate.sx, which covers // the opposite arm (fn-pointer typed `callconv(.c)` does get byval). #import "modules/std.sx"; Wide :: struct { a: s64; b: s64; c: s64; d: s64; } accept :: (w: Wide) -> s64 { w.a + w.b + w.c + w.d; } main :: () -> s32 { w := Wide.{ a = 1, b = 10, c = 100, d = 1000 }; direct := accept(w); if direct != 1111 { return 1; } fn_ptr : (Wide) -> s64 = xx accept; indirect := fn_ptr(w); if indirect != 1111 { return 2; } 0; }