From fca7e9ce2ae8328ad3d6d98fc0ad8a3279e8e22e Mon Sep 17 00:00:00 2001 From: agra Date: Tue, 19 May 2026 12:40:21 +0300 Subject: [PATCH] ffi 1.0: xfail parser test for #objc_call(T)(recv, "sel:", args...) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 98/98 regression tests pass (+ffi-objc-call-01-parse with xfail snapshot capturing today's parse error). Phase 1 of PLAN-FFI.md introduces three compiler intrinsics (`#objc_call`, `#jni_call`, `#jni_static_call`) that lift the ceremony off the existing typed-`objc_msgSend` and JNI dispatch patterns. This is the first step of the cadence: 1.0 (this commit): test-add. Locks the current parse rejection. 1.1 (next): make-green. Parser accepts the new syntax; this snapshot updates to whatever the next pipeline stage produces (sema/codegen still can't lower the intrinsic — that's later phase-1 steps). 1.3+: codegen lands; the test eventually runs cleanly against Foundation. `inline if false` wraps the call site so the AST carries the node but no codegen runs for it. Lets Phase 1.1's parse-only test pass without dragging in the sema/codegen plumbing prematurely. --- examples/ffi-objc-call-01-parse.sx | 25 ++++++++++++++++++++++ tests/expected/ffi-objc-call-01-parse.exit | 1 + tests/expected/ffi-objc-call-01-parse.txt | 1 + 3 files changed, 27 insertions(+) create mode 100644 examples/ffi-objc-call-01-parse.sx create mode 100644 tests/expected/ffi-objc-call-01-parse.exit create mode 100644 tests/expected/ffi-objc-call-01-parse.txt diff --git a/examples/ffi-objc-call-01-parse.sx b/examples/ffi-objc-call-01-parse.sx new file mode 100644 index 0000000..1a0ea70 --- /dev/null +++ b/examples/ffi-objc-call-01-parse.sx @@ -0,0 +1,25 @@ +// Phase 1 step 1.0 (PLAN-FFI.md): xfail test for the `#objc_call` +// parser. The shape is `#objc_call(ReturnT)(receiver, "selector:", +// args...)` — return type in the first parens, then a normal call. +// Today the parser rejects this; the snapshot captures the rejection. +// +// Phase 1.1 adds the parse rule and the snapshot updates to whatever +// the next pipeline stage produces (sema / codegen can't lower the +// intrinsic until later steps). +// +// Phase 1.3+ wires the lowering (selector interning + objc_msgSend +// dispatch) and the test eventually runs cleanly against Foundation. + +#import "modules/std.sx"; + +main :: () -> s32 { + // `#objc_call(void)` with a null receiver — never executed (this + // file's purpose is parser surface coverage). `inline if false` + // would suppress sema/codegen too, but for the parse-only step + // we want the AST to actually carry the node. + inline if false { + #objc_call(void)(null, "init"); + } + print("parse-only ok\n"); + 0; +} diff --git a/tests/expected/ffi-objc-call-01-parse.exit b/tests/expected/ffi-objc-call-01-parse.exit new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/tests/expected/ffi-objc-call-01-parse.exit @@ -0,0 +1 @@ +1 diff --git a/tests/expected/ffi-objc-call-01-parse.txt b/tests/expected/ffi-objc-call-01-parse.txt new file mode 100644 index 0000000..ccd4580 --- /dev/null +++ b/tests/expected/ffi-objc-call-01-parse.txt @@ -0,0 +1 @@ +/Users/agra/projects/sx/examples/ffi-objc-call-01-parse.sx:21:9: error: unexpected token in expression