"Param slot holds a pointer" is written 8 times; 3 copies disagree
Measured 2026-07-19. LATENT, not active — read the verification section before treating this as a live bug.
| site | IsRef | IsArray | frozen str | tySet | tyVariant |
|---|---|---|---|---|---|
x86-64 ir_codegen.inc:2616 |
y | y | y | y | y |
aarch64 :1410 |
y | y | y | y | y |
arm32 :130 |
y | y | y | y | y |
i386 :1639 |
y | y | y | n | y |
riscv32 :1166 |
y | y | y | n | y |
ParamSize symtab.inc:2231 |
y | y | tyString only | n | n |
AllocParam symtab.inc:2322 |
y | y | tyString only | n | y |
ParamSize and AllocParam are meant to encode ONE rule and already
contradict each other on tyVariant.
Verification — a prediction that FAILED
From the table I predicted a set param would misbehave on i386/riscv32 and
work on x86-64. Tested on all five hosted targets: all agree
(has a / no z). Sets reach params via IR_LEA on a materialised temp
(ir.inc:3563), not the param-slot path, so the disagreement never fires for
that shape.
So this is not a live miscompile. It is an unmaintainable rule: nobody can say
which of the 8 copies is authoritative, no test would catch a fourth drifting,
and adding tyVariant this session required editing six of them by hand.
Resolved properly by [[feature-a-abi-oracle]] rather than by patching the three
outliers — patching them just re-creates the same trap with 8 agreeing copies.
If the oracle is deferred, at minimum reconcile ParamSize with AllocParam,
since those two disagreeing is indefensible on its own.
Log
- 2026-07-22 — resolved, commit 84a499cb.