From 40f3a2aa5c853d3b821debeafcf07b8cf4cf204f Mon Sep 17 00:00:00 2001 From: Zuhaitz Méndez Fernández de Aránguiz Date: Thu, 22 Jan 2026 23:21:15 +0000 Subject: Lambda fix --- src/parser/parser_decl.c | 18 +++++++++++++++++- src/parser/parser_expr.c | 13 +++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) (limited to 'src/parser') diff --git a/src/parser/parser_decl.c b/src/parser/parser_decl.c index 63ec329..0cd2990 100644 --- a/src/parser/parser_decl.c +++ b/src/parser/parser_decl.c @@ -532,7 +532,23 @@ ASTNode *parse_var_decl(ParserContext *ctx, Lexer *l) { if (init->type_info) { - type_obj = init->type_info; + // Create new type to avoid inheriting is_const from builtins like true/false + type_obj = type_new(init->type_info->kind); + if (init->type_info->name) + { + type_obj->name = xstrdup(init->type_info->name); + } + if (init->type_info->inner) + { + type_obj->inner = init->type_info->inner; // Shallow copy for inner + } + // Copy function type args for lambda/closure support + if (init->type_info->args && init->type_info->arg_count > 0) + { + type_obj->args = init->type_info->args; + type_obj->arg_count = init->type_info->arg_count; + type_obj->is_varargs = init->type_info->is_varargs; + } type = type_to_string(type_obj); } else if (init->type == NODE_EXPR_SLICE) diff --git a/src/parser/parser_expr.c b/src/parser/parser_expr.c index 7993423..4a4f906 100644 --- a/src/parser/parser_expr.c +++ b/src/parser/parser_expr.c @@ -4769,6 +4769,10 @@ ASTNode *parse_arrow_lambda_single(ParserContext *ctx, Lexer *l, char *param_nam t->arg_count = 1; lambda->type_info = t; + // Register parameter in scope for body parsing + enter_scope(ctx); + add_symbol(ctx, param_name, "int", type_new(TYPE_INT)); + // Body parsing... ASTNode *body_block = NULL; if (lexer_peek(l).type == TOK_LBRACE) @@ -4789,6 +4793,7 @@ ASTNode *parse_arrow_lambda_single(ParserContext *ctx, Lexer *l, char *param_nam lambda->lambda.is_expression = 1; register_lambda(ctx, lambda); analyze_lambda_captures(ctx, lambda); + exit_scope(ctx); return lambda; } @@ -4812,6 +4817,13 @@ ASTNode *parse_arrow_lambda_multi(ParserContext *ctx, Lexer *l, char **param_nam } lambda->type_info = t; + // Register parameters in scope for body parsing + enter_scope(ctx); + for (int i = 0; i < num_params; i++) + { + add_symbol(ctx, param_names[i], "int", type_new(TYPE_INT)); + } + // Body parsing... ASTNode *body_block = NULL; if (lexer_peek(l).type == TOK_LBRACE) @@ -4832,5 +4844,6 @@ ASTNode *parse_arrow_lambda_multi(ParserContext *ctx, Lexer *l, char **param_nam lambda->lambda.is_expression = 1; register_lambda(ctx, lambda); analyze_lambda_captures(ctx, lambda); + exit_scope(ctx); return lambda; } -- cgit v1.2.3