e515a08fb71e4cd382338c85933fc29544d76d76
cstage rejected a deref-less function-pointer call `f(21)` (f: *fn...) with "calling non-function" while wwstage accepted it and ran correctly -- a cs!=ww divergence. Hare auto-dereferences a pointer callee to its fn type before the call. Peel one pointer level after the named-type chase so cstage accepts a `*fn` callee, matching wwstage and Hare. One level only, deliberately: the #181-cgen indirect-call path lowers the callee VALUE as the target (CALL AX), which is the fn address for a single `*fn` but only the address-of the fn-ptr for `**fn`. A multi-level peel would accept `**fn` past what cgen can lower -- a silent both-stage miscompile (returns garbage). cstage stays loud on `**fn` (rule 7); wwstage's loop-accept of all levels (check.ww:3763) is the over-permissive side, filed for align-down plus the deeper cgen multi-level autoderef. Surfaced by the codegen miscompile hunt (finding C6a). Pinned by test/lang/fnptr_derefless_call_test.ww (deref-less + canonical (*f)(21), multi-arg, alias-chain, tuple-return; reverting the peel reds the deref-less rows at compile).
Description
No description provided
Languages
C
89.4%
Python
7.2%
Makefile
2.3%
Shell
0.8%
Assembly
0.3%