diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-22 13:45:36 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-22 13:45:36 +0000 |
| commit | 3a6eb921b50e191468d29c233718657f9f85d68e (patch) | |
| tree | ebf411667c1a4360f6e78e0ac971f9df924511d1 /tests/i/extern-c-struct-value/program.cps | |
| parent | 06538905915b15bde6364459929fe89cf0b8de5c (diff) | |
feat(codegen): pass C-struct records by value
EXTERN parameters may now be C-struct records by value. clang's
arrangement decides the passing: coerced through memory, flattened
into elements, or indirect as byval or a pointer to a copy. Returning a
record by value stays rejected for now.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'tests/i/extern-c-struct-value/program.cps')
| -rw-r--r-- | tests/i/extern-c-struct-value/program.cps | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/tests/i/extern-c-struct-value/program.cps b/tests/i/extern-c-struct-value/program.cps new file mode 100644 index 0000000..9db6319 --- /dev/null +++ b/tests/i/extern-c-struct-value/program.cps @@ -0,0 +1,57 @@ +// Records whose fields are C types pass to C functions by value. +INCLUDE_OBJ "lib.o" +TYPE CShort = C_TYPE("short") +TYPE CFloat = C_TYPE("float") +TYPE CLongLong = C_TYPE("long long") +TYPE Pair + DECLARE A : C_INT + DECLARE B : C_INT +ENDTYPE +TYPE Vec2 + DECLARE X : C_DOUBLE + DECLARE Y : C_DOUBLE +ENDTYPE +TYPE Mixed + DECLARE Tag : C_CHAR + DECLARE Value : C_DOUBLE + DECLARE Count : C_INT +ENDTYPE +TYPE Vec3f + DECLARE X : CFloat + DECLARE Y : CFloat + DECLARE Z : CFloat +ENDTYPE +TYPE Wide + DECLARE Lo : CLongLong + DECLARE Hi : CLongLong +ENDTYPE +EXTERN "C" EXTERN_FUNCTION pair_sum(Pair) RETURNS C_INT +EXTERN "C" EXTERN_FUNCTION vec2_dot(Vec2, Vec2) RETURNS C_DOUBLE +EXTERN "C" EXTERN_FUNCTION mixed_score(CShort, Mixed, C_INT) RETURNS C_DOUBLE +EXTERN "C" EXTERN_FUNCTION vec3f_sum(Vec3f) RETURNS C_DOUBLE +EXTERN "C" EXTERN_FUNCTION wide_after_five(C_INT, C_INT, C_INT, C_INT, C_INT, Wide) RETURNS CLongLong +DECLARE P : Pair +DECLARE U : Vec2 +DECLARE V : Vec2 +DECLARE M : Mixed +DECLARE F : Vec3f +DECLARE W : Wide +P.A <- (C_INT)3 +P.B <- (C_INT)4 +OUTPUT pair_sum(P) +U.X <- (C_DOUBLE)1.5 +U.Y <- (C_DOUBLE)2 +V.X <- (C_DOUBLE)4 +V.Y <- (C_DOUBLE)0.25 +OUTPUT vec2_dot(U, V) +M.Tag <- (C_CHAR)'M' +M.Value <- (C_DOUBLE)2.5 +M.Count <- (C_INT)3 +OUTPUT mixed_score((CShort)-1, M, (C_INT)4) +F.X <- (CFloat)0.5 +F.Y <- (CFloat)1.25 +F.Z <- (CFloat)2 +OUTPUT vec3f_sum(F) +W.Lo <- (CLongLong)100 +W.Hi <- (CLongLong)1000 +OUTPUT wide_after_five((C_INT)1, (C_INT)2, (C_INT)3, (C_INT)4, (C_INT)5, W) |
