Calling through an unwrapped optional closure (g!()) crashed with LLVM
'Called function must be a pointer!': the indirect-call catch-all else
arm emitted call_indirect on the whole {fn,env} closure struct with a
hardcoded .i64 return. The else arm now inspects inferExprType(callee):
a .closure callee dispatches through call_closure (threads env + ctx via
the [ctx, env, user_args] ABI, returns closure.ret); a plain fn pointer
uses call_indirect with the callee's real function.ret instead of i64.
The filed repro's ?(() -> void) spelling is a tuple-optional (now
diagnosed by the 0165 fix); the real ?Closure(...) layout was already
correct. Verified load-bearing (HEAD crashes) by 3 adversarial reviews,
suite 785/0. Regression: examples/closures/0311-closures-optional-closure.sx.
Filed adjacent bug 0177 (array-element closure direct call crashes).
15 lines
138 B
Plaintext
15 lines
138 B
Plaintext
a-present
|
|
a n=7
|
|
b-called
|
|
c-absent
|
|
c==null: true
|
|
c!=null: false
|
|
c-reassigned
|
|
c2-absent
|
|
fallback
|
|
e-real
|
|
a n=7
|
|
param-absent
|
|
from-give
|
|
add: 7
|