GC-ness now comes from the inference pass, not only the annotation. A class is traced if the structural SCC put it in `syms.traced`, OR (temporary bridge until demand-promotion lands) it still carries `@gc`. - Types.symbols gains a `traced : StringSet.t`; is_gc_class reads it (union'd with the surviving @gc annotation). All symbols literals + both merges carry the field. - typecheck_all injects the classification once (Gcinfer.classify -> traced) into the merged table AND every module table, before typecheck/owner/emit. - emit.ml routes the class gc-flag and the union/drop decision through is_gc_class instead of the raw `.is_gc`, so structurally-inferred gc classes get the runtime flag. Field-kind derivation already routed through is_gc_class. - gcinfer.traced_names exposes the traced set for injection. Effect: docs/examples/gc-cycle now COMPILES with no annotation (the WO-E301 use-after-move at the ring-closing store is gone) — traced classes alias freely. Bytecode is byte-identical to writing `@gc class Node`. Verified: woc-test 566/0 (goldens unchanged — every current @gc class stays gc via the annotation branch, and no golden has a structural-gc-non-annotated class); oop-e2e 79/0 (gc corpus green). Not in this slice: demand-promotion (the acyclic-aliased PriceCache case still needs the @gc bridge) and @gc-in-source-as-error (Phase 2b); the ring RUNNING (the RC runtime doesn't implement nullable-gcref `?Node` fields — Phase 3). WO-W201 still fires on gc-cycle (retired in Phase 4). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| examples | ||
| plan | ||
| stories/language-runtime-database | ||
| superpowers | ||
| 00-code-review.md | ||
| 00-principles.md | ||
| 00-status.md | ||
| 01-problem.md | ||
| 08-project-structure.md | ||