ffi checkpoint: issue-0045 fix + step 1 wrap-up
Logs the issue-0045 fix (inline-return slot for comptime-call bodies, commits3d32ab0+9e78790) — the LLVM verifier crash that surfaced when probing step 2 of the pack feature. Test count now 194/194 with the new regression test.
This commit is contained in:
@@ -6,6 +6,45 @@ add a test and make it pass — that's two commits).
|
|||||||
|
|
||||||
## Last completed step
|
## Last completed step
|
||||||
|
|
||||||
|
**issue-0045 fix — inline-return slot for comptime-call bodies**
|
||||||
|
(commit `9e78790`, lock-in `3d32ab0`).
|
||||||
|
|
||||||
|
Surfaced by probing step-2 territory of the pack feature: any
|
||||||
|
comptime fn (`is_comptime` param, non-void return) with a block
|
||||||
|
body containing `return X;` trips LLVM's "Terminator found in
|
||||||
|
the middle of a basic block" verifier. `lowerComptimeCall`
|
||||||
|
inlines the body's statements directly into the caller, and
|
||||||
|
`lowerReturn` emits `ret` into the caller's basic block — but
|
||||||
|
the caller still has trailing instructions.
|
||||||
|
|
||||||
|
Root cause was broader than packs: `format`/`print` use arrow
|
||||||
|
form (`=> expr`) or `#insert`-only bodies, so no stdlib comptime
|
||||||
|
fn took the `return`-with-trailing-statements path. Step 1.b
|
||||||
|
made `..$args` parseable; the natural smoke test
|
||||||
|
`foo :: (..$args) -> s64 { return 42; }` was the first body to
|
||||||
|
hit it.
|
||||||
|
|
||||||
|
Fix in `src/ir/lower.zig`:
|
||||||
|
- New `inline_return_target: ?InlineReturnInfo` on Lowering.
|
||||||
|
`InlineReturnInfo` carries a result slot Ref + the ret_ty.
|
||||||
|
- `lowerComptimeCall` calls `fnBodyHasReturn` to scan the body;
|
||||||
|
when true, it allocates a slot, installs it as
|
||||||
|
`inline_return_target`, lowers the body, and either returns
|
||||||
|
the tail expression value OR loads the slot when
|
||||||
|
`block_terminated` is set. Pure tail-expression bodies skip
|
||||||
|
the slot entirely — keeps the common `#insert`-based path
|
||||||
|
unchanged.
|
||||||
|
- `lowerReturn` checks `inline_return_target` first: when set,
|
||||||
|
stores the coerced value into the slot, drains pending
|
||||||
|
defers, sets `block_terminated = true`, and returns without
|
||||||
|
emitting `ret`. Otherwise the standard `ret` path runs.
|
||||||
|
|
||||||
|
Regression test `examples/issue-0045.sx` flips from the LLVM
|
||||||
|
verifier crash to `42`. 194/194 example tests + `zig build test`
|
||||||
|
green.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
**M5.A.next.1d.B — variadic heterogeneous type packs: pack-aware impl
|
**M5.A.next.1d.B — variadic heterogeneous type packs: pack-aware impl
|
||||||
matching** (commit `08feb60`).
|
matching** (commit `08feb60`).
|
||||||
|
|
||||||
@@ -394,8 +433,10 @@ plus 2 codegen fixes surfaced along the way.**
|
|||||||
|
|
||||||
## Current state
|
## Current state
|
||||||
|
|
||||||
- 185/185 example tests pass; `zig build test` green.
|
- 194/194 example tests pass; `zig build test` green.
|
||||||
- Phase 3.0/3.1/3.2 + M1.0–M1.3 + M2.1–M2.3 + M3 + M4.0 + M4.A all landed.
|
- Phase 3.0/3.1/3.2 + M1.0–M1.3 + M2.1–M2.3 + M3 + M4.0 + M4.A all landed.
|
||||||
|
- Pack feature step 1 done (1c.A → 1d.B; commits bb6eca6 → 08feb60).
|
||||||
|
- issue-0045 (comptime-fn-with-return verifier crash) fixed (9e78790).
|
||||||
- Chess on macOS / iOS-sim / Android all build and run.
|
- Chess on macOS / iOS-sim / Android all build and run.
|
||||||
|
|
||||||
**M4.0 — context.allocator threading** (4 commits this session):
|
**M4.0 — context.allocator threading** (4 commits this session):
|
||||||
|
|||||||
Reference in New Issue
Block a user