From 624a73ae10eb3aaa535eb41c023c59919df28c99 Mon Sep 17 00:00:00 2001 From: A404M Date: Thu, 20 Mar 2025 04:52:30 +0330 Subject: fix bug in paramter types in function calls --- src/compiler/ast-tree.c | 73 +++++++++++++++++++++++++++++++------------------ src/runner/runner.c | 3 +- test/main.felan | 20 +++----------- 3 files changed, 53 insertions(+), 43 deletions(-) diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index aee480d..6d9440b 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -2611,13 +2611,19 @@ bool setTypesPrintU64(AstTree *tree, AstTreeSetTypesHelper _helper) { } } -bool setTypesReturn(AstTree *tree, AstTreeSetTypesHelper helper, +bool setTypesReturn(AstTree *tree, AstTreeSetTypesHelper _helper, AstTreeFunction *function) { if (function == NULL) { printError(tree->str_begin, tree->str_end, "Return can't be here"); } + AstTreeReturn *metadata = tree->metadata; if (metadata->value != NULL) { + AstTreeSetTypesHelper helper = { + .lookingType = getValue(function->returnType, _helper), + .treeHelper = _helper.treeHelper, + .pages = _helper.pages, + }; if (!setAllTypes(metadata->value, helper, NULL)) { return false; } else if (!typeIsEqual(metadata->value->type, function->returnType)) { @@ -2651,12 +2657,6 @@ bool setTypesTypeFunction(AstTree *tree, AstTreeSetTypesHelper helper) { bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper helper) { AstTreeFunctionCall *metadata = tree->metadata; - for (size_t i = 0; i < metadata->parameters_size; ++i) { - if (!setAllTypes(metadata->parameters[i], helper, NULL)) { - return false; - } - } - if (metadata->function->token != AST_TREE_TOKEN_VARIABLE) { printError(tree->str_begin, tree->str_end, "Not yet supported"); return false; @@ -2673,6 +2673,23 @@ bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper helper) { return NULL; } + for (size_t i = 0; i < metadata->parameters_size; ++i) { + AstTreeVariable *arg = function->arguments.data[i]; + AstTree *param = metadata->parameters[i]; + + AstTreeSetTypesHelper newHelper = { + .lookingType = arg->type, + .pages = helper.pages, + .treeHelper = helper.treeHelper, + }; + + if (!setAllTypes(param, newHelper, NULL)) { + return false; + } + } + for (size_t i = 0; i < function->arguments.size; ++i) { + } + tree->type = copyAstTree(function->returnType); return true; } @@ -2781,27 +2798,31 @@ bool setTypesAstVariable(AstTreeVariable *variable, if (variable->type == NULL) { return false; - } else if (variable->value != NULL && - !typeIsEqual(variable->value->type, variable->type)) { - printError(variable->name_begin, variable->name_end, "Type mismatch %s", - AST_TREE_TOKEN_STRINGS[variable->value->token]); - return false; - } - - if (variable->value != NULL && variable->isConst) { - if (!isConst(variable->value, helper.treeHelper)) { - printError(variable->value->str_begin, variable->value->str_end, - "Can't initialize constant with non constant value"); + } else if (variable->value != NULL) { + if (!typeIsEqual(variable->value->type, variable->type)) { + printError(variable->name_begin, variable->name_end, + "Type mismatch value = %s but type = %s", + AST_TREE_TOKEN_STRINGS[variable->value->type->token], + AST_TREE_TOKEN_STRINGS[variable->type->token]); return false; - } - AstTree *value = variable->value; - variable->value = getValue(value, helper); - if (variable->value != value) { - astTreeDelete(value); - } + } else if (variable->isConst) { + if (!isConst(variable->value, helper.treeHelper)) { + printError(variable->value->str_begin, variable->value->str_end, + "Can't initialize constant with non constant value"); + return false; + } + AstTree *value = variable->value; + variable->value = getValue(value, helper); + if (variable->value == NULL) { + return false; + } + if (variable->value != value) { + astTreeDelete(value); + } - if (variable->value == NULL) { - return false; + if (variable->value == NULL) { + return false; + } } } diff --git a/src/runner/runner.c b/src/runner/runner.c index cf1c92e..36c84e5 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -215,7 +215,8 @@ AstTree *runAstTreeFunction(AstTree *tree, AstTree **arguments, AstTree *ret = &AST_TREE_VOID_VALUE; for (size_t i = 0; i < function->scope.expressions_size; ++i) { - AstTree *r = runExpression(function->scope.expressions[i], &pages, &shouldRet); + AstTree *r = + runExpression(function->scope.expressions[i], &pages, &shouldRet); if (shouldRet) { ret = r; break; diff --git a/test/main.felan b/test/main.felan index 7715214..111da65 100644 --- a/test/main.felan +++ b/test/main.felan @@ -2,21 +2,9 @@ main :: () -> void { print_u64 a; }; -a :: f(); +a :: f(2); -f :: ()->u64{ - b :u64= 2; - r := 2; - if r % 2 == 0 - return b; - else - return d(); -}; - -d :: ()->u64{ - return c(); -}; - -c :: ()->u64{ - return d(); +f :: (arg:u64)->u64{ + b:=arg; + return b; }; -- cgit v1.2.3