summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-03-20 04:52:30 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-03-20 04:52:30 +0330
commit624a73ae10eb3aaa535eb41c023c59919df28c99 (patch)
tree9aca0fe00deb01c609cc0ff725d2f3d6edbb8c29
parent698c80e46460ab76fd4859a7c3026650bd3cce44 (diff)
fix bug in paramter types in function calls
-rw-r--r--src/compiler/ast-tree.c73
-rw-r--r--src/runner/runner.c3
-rw-r--r--test/main.felan20
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;
};