From e3cc6c585a15fe4478dd2312bf5d390896729a31 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Thu, 22 Oct 2026 13:46:40 +0000 Subject: feat(codegen): return C-struct records by value EXTERN_FUNCTION may now return a C-struct record by value, either through caller-supplied sret memory or as a coerced value stored back into the record, as clang arranges it. This removes the last by-value rejection. Co-Authored-By: Claude Opus 5.5 --- tests/i/extern-c-struct-value/program.cps | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'tests/i/extern-c-struct-value/program.cps') diff --git a/tests/i/extern-c-struct-value/program.cps b/tests/i/extern-c-struct-value/program.cps index 9db6319..6b2cb8e 100644 --- a/tests/i/extern-c-struct-value/program.cps +++ b/tests/i/extern-c-struct-value/program.cps @@ -1,4 +1,4 @@ -// Records whose fields are C types pass to C functions by value. +// Records whose fields are C types pass to and return from C functions by value. INCLUDE_OBJ "lib.o" TYPE CShort = C_TYPE("short") TYPE CFloat = C_TYPE("float") @@ -30,6 +30,10 @@ 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 +EXTERN "C" EXTERN_FUNCTION make_pair(C_INT, C_INT) RETURNS Pair +EXTERN "C" EXTERN_FUNCTION make_vec2(C_DOUBLE, C_DOUBLE) RETURNS Vec2 +EXTERN "C" EXTERN_FUNCTION make_mixed(C_CHAR, C_DOUBLE, C_INT) RETURNS Mixed +EXTERN "C" EXTERN_FUNCTION make_vec3f(CFloat, CFloat, CFloat) RETURNS Vec3f DECLARE P : Pair DECLARE U : Vec2 DECLARE V : Vec2 @@ -55,3 +59,12 @@ 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) +P <- make_pair((C_INT)3, (C_INT)4) +OUTPUT P.A, " ", P.B +OUTPUT pair_sum(make_pair((C_INT)5, (C_INT)6)) +U <- make_vec2((C_DOUBLE)1.5, (C_DOUBLE)2) +OUTPUT U.X, " ", U.Y +M <- make_mixed((C_CHAR)'Q', (C_DOUBLE)0.25, (C_INT)9) +OUTPUT M.Tag, " ", M.Value, " ", M.Count +F <- make_vec3f((CFloat)0.5, (CFloat)1.25, (CFloat)2) +OUTPUT F.X, " ", F.Y, " ", F.Z -- cgit v1.3.1-4-g156e