// A FAILED value-param bind on a type-RETURNING FUNCTION must emit exactly its // own diagnostic and NOT cascade a bogus `field '…' not found on ''` when the // binding is later field-accessed. The type-fn binder must poison the binding to // `.unresolved` (the diagnosed-poison sentinel) — exactly like the struct binder — // so the downstream `.len` is suppressed, not reported as a second error. // // Regression (issue 0083): the type-fn path (`instantiateTypeFunction`) fell // through to an empty-struct placeholder named after the function on a failed // value-param bind, so `a.len` produced a second `field 'len' not found on // 'MakeC'` error. The struct binder already returned `.unresolved` here; the // type-fn binder now matches it. Three failure modes, three clean diagnostics, // zero field cascades: // - value-param overflow via an aliased integer constraint (`$K: Count`), // - a non-const value-param arg (`get()`), // - an unknown TYPE arg (`NoSuchType`) — must still report the unknown type. #import "modules/std.sx"; Count :: u32; MakeC :: ($K: Count, $T: Type) -> Type { return [K]T; } get :: () -> u32 { return 4; } main :: () { a : MakeC(5000000000, i64) = ---; b : MakeC(get(), i64) = ---; c : MakeC(3, NoSuchType) = ---; print("unreachable {} {} {}\n", a.len, b.len, c.len); }