Final closer for the A.6.2 sequence. Mirror of harec's `assert(expr->result)` at ref/harec/src/check.c:3810: every value- producing nkind dispatched by resolvewalk (L475-488 + N_DOT at L391) reaches a stamping arm in exprtype that sets e.type_ before returning. asserttyped is the post-checker invariant gate; it walks checkfile's decls in pass 3 (same curmod context exprtype saw in pass 2) and writes a one-line stderr diagnostic for any dispatched node whose type_ remained nil. Three residual gates encode bails that aren't true gaps until #19 (Drew's δ: dedicated AST kinds for alloc/size/etc.) retires the seeded-SK_FN-with-nil-decl + SK_USE-as-value shapes: 1. N_IDENT resolving to SK_USE (module ref like `os` in `os.write`) 2. N_IDENT whose sym.decl == nil (pseudo-builtin callee — len, append, free, alloc, size, align, offset seeded at L86-98) 3. N_IDENT in LHS-of-N_DOT syntactic position (member-access lookup target, not value-producing) — tracked via `indot` param ZERO fires across all 5 selfhost combined.ww corpora (wcc, w6c, w6a, w6l, wwdump). asserttyped IS the regression catch — future commits that drop a type_ stamp will fire it during the 990_selfhost probes; no standalone table-driven test is bundled. Accreted folds: - 5-lite-a (#33): dispatcher-invariant docstring at exprtype L1535. - 5-lite-b (#34): WHY comments at 9 helper bail sites (unifyarith/binoptype/unoptype/indexresult) classifying each as unreachable-for-valid-input, propagation-from-callee, or invalid-input (cstage errors at the matching cite). Cites ref/harec/src/types.c type_promote on the function-doc updates. - A.6.2.1c (#24): three propagation pointers re-cite the inherent-IDENT bail at exprtype N_IDENT arm L1596-1599. - unoptype TK_STAR dead `if (u == nil) { return nil; }` removed — resolvealias(unwrapbang(non-nil)) is non-nil by parser invariant (parsetype L148 always sets N_TBANG.lhs; resolvealias L514-569 every exit returns non-nil for non-nil input). lib/ww/ast.ww: nkname becomes export so asserttyped's diagnostic can format the offending node's kind without duplicating the table. Closes #4 (A.6.2 umbrella) and #15 (A.6.2.1e).
This commit is contained in:
@@ -149,7 +149,7 @@ export fn newnode(k: nkind, file: str, line: i32, col: i32) *node = {
|
||||
|
||||
// ---- printer ----------------------------------------------------------
|
||||
|
||||
fn nkname(k: nkind) str = {
|
||||
export fn nkname(k: nkind) str = {
|
||||
if (k == nkind.N_NONE) { return "none"; };
|
||||
if (k == nkind.N_INTLIT) { return "int"; };
|
||||
if (k == nkind.N_FLOATLIT) { return "float"; };
|
||||
|
||||
Reference in New Issue
Block a user