3ec944a67f7744adbb5e0e9028cc31891e7ecc0c
Mirror cstage cmd/wcc/check.c:907-960. Three typed-builtin intercepts that cstage already had: - size(T) — folds to a literal integer at check time from a newly-introduced astsize walker over the type AST. Mirrors the size computation in cstage resolve_type at check.c:286-528. - align(T) — same, via astalign. - offset(e.f) — folds the byte offset of field f in e's struct type via astoffset. Peels exactly one N_TPTR for `p.field`. seedprimitives registers the three names as SK_FN nil; exprtype's N_CALL arm gates on a same-module shadow check (per #23 alloc precedent) and consumes the parser-planted type-expression arg. The fold is in-place — foldtointlit mutates N_CALL into N_INTLIT so cgen sees a plain integer. resolvewalk's N_CALL trigger invokes exprtype so the fold fires from non-let contexts too (e.g. inside `if (size(T) != …)`). selfhost/test/smoke.ww gains a probe-8 block: size/align/offset assertions across str, primitive widths, ptrs, slices, and two structs (`point`, `mixalign`) covering both no-padding and i8+i64 natural-align padding cases. Known divergences NOT in #42 scope: - size((*T|void)) ≠ 8 on the cstage nullable-ptr fold (#13 family, unreachable through current grammar). - 8B-struct bare-let zero-init wwstage skip vs cstage emit (#59). - Same-module shadow gate added here, cstage has none — sibling shape to #26 (free/append/len gates). Closes the original chain that started with the user's call to fix the structural debt — six precondition fixes (#51, #52, #53, #55, #56, #50) landed before this fold could safely live in the check pass. Unblocks #43 (sweep literal 16s → size(str)) and #1 (str → 24B becomes one line).
Description
No description provided
Languages
C
89.4%
Python
7.2%
Makefile
2.3%
Shell
0.8%
Assembly
0.3%