summaryrefslogtreecommitdiff
path: root/src/parser
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-22 23:21:15 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-22 23:21:22 +0000
commit40f3a2aa5c853d3b821debeafcf07b8cf4cf204f (patch)
tree2bc3a628301001055fcc545ee88a4f4bacef6f81 /src/parser
parentdf8c377cfe4397c522ea67fe97bdacc1c7115ee9 (diff)
Lambda fix
Diffstat (limited to 'src/parser')
-rw-r--r--src/parser/parser_decl.c18
-rw-r--r--src/parser/parser_expr.c13
2 files changed, 30 insertions, 1 deletions
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;
}