test(embed): pin two-record-param per-tick (State, Tick) -> State on the shipped M3 ABI
Coverage backfill for an already-shipped capability — NO language / checker / codegen / schema / runtime change (4 new files, all under examples/ and crates/ail/tests/). Property protected: the M3 export gate is_c_abi_type runs as a per-parameter loop, accepting a single-ctor all-scalar record independently per param; the staticlib forwarder maps every non-scalar Type::Con to a bare ptr (M3-frozen). So a kernel (State, Tick) -> State with BOTH params single-ctor all-scalar records is callable from C today — a record Tick pushed per call, not just a scalar sample. Every shipped M3 fixture pushes a scalar Float; none pinned the two-record-param shape (the actual minimal data-server binding). This is the residual of the retired M4. Added: - examples/embed_backtest_step_tick.ail (own Tick) - examples/embed_backtest_step_tick_borrow.ail (borrow Tick) - crates/ail/tests/embed/tick_roundtrip.c (C host, -DBORROW) - crates/ail/tests/embed_tick_e2e.rs (2 E2E tests) Both E2E tests pass on HEAD (Boss-verified, not just agent-claimed): own + borrow, globally leak-free (Sigma allocs == Sigma frees across the ctx readback + g_rc atexit lines, the M3 dual-stat-line model), acc/n value-correct, exit 0. Independently re-confirms the M4 retirement reasoning: the capability is genuinely present in M3. Honest, deliberately NOT silenced: the new fixtures emit an advisory [over-strict-mode] warning (ail check still exits 0, non-gating) that the M3 scalar-sample original does not. Root cause characterized: a conservative over-strict-mode false-positive whose discriminator is the nested second (match tick ...) — structurally identical `st` handling warns when its term-ctor rebuild is nested inside an inner match. It is advisory only and does not affect codegen, the ABI, or the proven property. The fixture is kept in its LLM-natural form (dont-adapt-tests-to-bugs); the lint precision wart is surfaced as a separate finding, not papered over.
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
(module embed_backtest_step_tick
|
||||
|
||||
(data State
|
||||
(ctor State (con Float) (con Int)))
|
||||
|
||||
(data Tick
|
||||
(ctor Tick (con Float)))
|
||||
|
||||
(fn step
|
||||
(export "backtest_step_tick")
|
||||
(type
|
||||
(fn-type
|
||||
(params (own (con State)) (own (con Tick)))
|
||||
(ret (con State))))
|
||||
(params st tick)
|
||||
(body
|
||||
(match st
|
||||
(case (pat-ctor State acc n)
|
||||
(match tick
|
||||
(case (pat-ctor Tick px)
|
||||
(term-ctor State State (app + acc px) (app + n 1)))))))))
|
||||
Reference in New Issue
Block a user