feat(bootstrap): function pointer types + C emission

- Add tekFunc AST node and parser support for func(Params) -> Ret
- Add tkFunc type resolution in sema and hir_lower
- Add &FuncName address-taking yielding tkMutRef(tkFunc)
- Fix C emission: function pointer params use Ret (*name)(Params) syntax
  via cParamDecl helper that embeds the name inside (*)
- Fix forward declarations and temp declarations for function pointers
- Add funcPtrTypes table in C backend so &Fn temps get proper type
- Add _test_funcptr integration test
This commit is contained in:
2026-06-08 22:31:32 +03:00
parent 3f0a3901ca
commit 2e536488e6
9 changed files with 99 additions and 9 deletions
+7 -1
View File
@@ -264,6 +264,12 @@ proc resolveTypeExpr(ctx: var LowerCtx, te: TypeExpr): Type =
of tekDynRef: return makeDynRef(te.dynInterface)
of tekPointer: return makePointer(ctx.resolveTypeExpr(te.pointerPointee))
of tekSlice: return makeSlice(ctx.resolveTypeExpr(te.sliceElement))
of tekFunc:
var params: seq[Type] = @[]
for p in te.funcParams:
params.add(ctx.resolveTypeExpr(p))
let ret = if te.funcRet != nil: ctx.resolveTypeExpr(te.funcRet) else: makeVoid()
return makeFunc(params, ret)
else: return makeUnknown()
# Forward declarations
@@ -320,7 +326,7 @@ proc resolveExprType(ctx: var LowerCtx, expr: Expr): Type =
of ekUnary:
case expr.exprUnaryOp
of tkBang: return makeBool()
of tkAmp: return makePointer(ctx.resolveExprType(expr.exprUnaryOperand))
of tkAmp: return makeMutRef(ctx.resolveExprType(expr.exprUnaryOperand))
of tkStar:
let inner = ctx.resolveExprType(expr.exprUnaryOperand)
if inner.isPointer: return inner.inner[0]