# V3 step 8.3 — `QbeGen` compiles clean; empty statements; 1-char strings (105/105) Both hand-written compiler modules now compile clean under V3. ## What landed 1. **Within-module forward procedure calls (gm2-compatible sources).** `QbeGen.mod` calls 10 internal helpers before their definitions. gm2's `FORWARD` is unusable (its whole-program pass errors with `too many errors in pass 3` — reproduced with a minimal module), and reordering cascades through `NewTemp`/`Op3L`/`Revive`/ `HeapSize`/`InitStack`. Fix: declare the 10 helpers in `QbeGen.def` (its role is already "everything the generated parser needs"), so they are visible throughout the implementation. `ArrData`/`HeapSize` signatures use `INTEGER` in both def and impl. 2. **Single-character string literals for `ARRAY OF CHAR`.** `"("`, `"0"`, `"$"` etc. were typed `CHAR`, so `W("(")` reported "invalid call". New `QbeGen.DeclCharStr` synthesizes the equivalent 1-char string descriptor; `ActParam` uses it when the formal is an array of `CHAR` and the actual is an immediate `CHAR`. This cleared all 85 remaining `QbeGen` errors. 3. **Empty statements.** `StatSeq = Statement { ";" [ Statement ] }` accepts `;;`, lone `;` and trailing `;` — required because Coco/R emits `;;` in the generated `M2P.mod`. New test `tests/t_emptystat.mod` (42). Also removed a stray `END;;` in `QbeGen.mod`. ## Result - `SymTab.def/.mod`: clean (step 8.2). - `QbeGen.def/.mod`: **clean** (this step). - Suite **105/105**, build warning-free. ## Remaining self-hosting gaps (measured) Coco/R-generated sources `src/M2S.mod` (30 errors), `src/M2P.mod`, `src/M2.mod`: - **Procedure types** are unsupported: `GetCH = PROCEDURE (INT32): CHAR;` and procedure variables (`CurrentCh: GetCH;`), and the `Error: PROCEDURE (...)` callback in `M2S.def`. This is the main `M2S` blocker (`invalid Type`, then cascade). Likely step 9. - **`INT32` (a `FileIO.INT32` alias) is seen as "not a type name"** in `M2S.mod` var/param types — need to confirm once procedure types parse. - **Host `FileIO` open-file cap:** `MaxFiles = BitSetSize` (16) blocks compiling all ~16 compiler modules in one driver session (`Too many files`). Raise it, or use the self-hosted `FileIO` (stage-2 syslib) whose limit can be larger. ## Files `compiler/src/{QbeGen.def,QbeGen.mod,M2.atg}`, `compiler/tests/t_emptystat.mod`, `compiler/run_tests.sh`.