aboutsummaryrefslogtreecommitdiff
path: root/tests/i/extern-c-struct-value/program.cps
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-22 13:45:36 +0000
committer_ov4 <ov4@ov4.org>2026-10-22 13:45:36 +0000
commit3a6eb921b50e191468d29c233718657f9f85d68e (patch)
treeebf411667c1a4360f6e78e0ac971f9df924511d1 /tests/i/extern-c-struct-value/program.cps
parent06538905915b15bde6364459929fe89cf0b8de5c (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.cps57
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)