✓
Passing This code compiles and runs correctly.
Code
// PIN (2026-07-05): a call inside a FOR range-bound expression is ILLEGAL —
// calls are not expressions (see concepts/frag-arguments-are-atoms). The
// idiom is bind-first:
// g(a: 4): n |> for(1..n) ...
//
// Guarded by the KORU104 expression-admission wall (flow_checker, Stage A);
// for-bounds parse as invocation arguments, so the argument walk covers
// them. Before the wall: `for (1..g(a: 4))` pasted verbatim into emitted
// Zig, raw Stage-D host error.
import std/io
pub event g { a: i64 } -> i64
g -> a + 1
capture { acc: 0[i64] }
! as s |> for(1..g(a: 4))
! each i |> captured { acc: s.acc + @as(i64, @intCast(i)) }
| captured r |> std/io:print.ln("{{ r.acc:d }}")
Frontend must reject with:
CONTAINS error[KORU104
CONTAINS nested call
CONTAINS chainError Verification
Expected Error Pattern
A call inside a FOR range-bound expression is illegal — calls are not
expressions; the idiom is bind-first (`g(a: 4): n |> for(1..n)`).
Guarded by the KORU104 expression-admission wall (flow_checker, Stage A) —
for-bounds parse as invocation arguments, so the argument walk covers
them. Previously the call's Koru syntax leaked verbatim into emitted Zig
(raw Stage-D error).Actual Compiler Output
error[KORU104]: nested call in argument '1..g(a: 4)' — calls are not expressions; use event chaining: bind the result first
--> tests/regression/320_CONTROL_FLOW/320_131_call_in_for_bound/input.k:16:0
|
16 | ! as s |> for(1..g(a: 4))
| ^
hint: rewrite as `event(args): x |> ...` and use `x` hereFlows
flow ~capture click a branch to expand · @labels scroll to their anchor
capture (source: acc: 0[i64])
Test Configuration
MUST_FAIL