cb78abf9e9ac10cf44701a2631e40cb0af94ce88
Three more structural checks from C check.c ported to selfhost, at the AST level (no resolved tinfo). is/as validity: e is T / e as T require e's declared type to be a tagged union and T to name a variant. Mirrors the case-variant check that just landed. let init-type and return-type assignability: a new exprtype helper infers an AST type-node for literal/ident/call/cast/?/as/is expressions; isassignable approximates C type_assignable on the shapes we can resolve — exact match, untyped numeric → typed numeric, untyped nil → ptr/slice/chan/fn, variant inclusion, and two-primitive-mismatch. isassignable returns (ok, confident). When confident=false the check emits no error — better to miss a real bug than fire a false positive on a binary-op expression we can't infer. This keeps existing selfhost code clean while still catching the common typo cases (let x: bool = 42; return "hi" from i32 fn). Naming: all new helpers follow Plan 9 run-together convention per CLAUDE.md (`typeeqast`, `isassignable`, `exprtype`, ...). Earlier work that used snake_case helpers (`case_variant_in`, `check_match_exhaustive`, ...) got the same treatment — bulk renamed in this commit. Five new rows in 950_selfcheck exercise the new checks (is-not-a-variant, two let mismatches, return mismatch, plus the case-variant row already there).
Description
No description provided
Languages
C
89.4%
Python
7.2%
Makefile
2.3%
Shell
0.8%
Assembly
0.3%