diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-05-31 06:26:48 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-05-31 06:26:48 +0330 |
commit | 3c53293e9b2c2f9106da805d26b5eab9dff56225 (patch) | |
tree | d88cff685789812698e16711bb61e35e2918b110 /src/compiler | |
parent | faf462fe49bf642866175d842a98d721f8f66208 (diff) |
function with exact types are prefered to shape shifters
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/ast-tree.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 08c8091..0563086 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -7652,7 +7652,13 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin, const char *name_end, AstTreeSetTypesHelper helper, AstTreeFunctionCall *functionCall) { - AstTreeVariable *variable = NULL; + struct { + AstTreeVariable *var; + int op; + } variable = { + .var = NULL, + .op = 10, + }; const char *str = name_begin; const size_t str_size = name_end - name_begin; @@ -7672,7 +7678,8 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin, return NULL; } - variable = var; + variable.var = var; + variable.op = 0; break; } } else { @@ -7750,13 +7757,17 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin, goto CONTINUE_OUTER; } } - if (variable != NULL) { + if (variable.var != NULL && variable.op == 0) { printError(name_begin, name_end, "Multiple candidates found for %.*s", (int)(name_end - name_begin), name_begin); return NULL; } - variable = var; + variable.var = var; + variable.op = 0; } else if (var->type->token == AST_TREE_TOKEN_TYPE_SHAPE_SHIFTER) { + if (variable.op < 1) { + continue; + } AstTreeShapeShifter *shapeShifter = var->value->metadata; AstTreeFunction *function = shapeShifter->function; @@ -7863,12 +7874,13 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin, } free(arguments.data); - if (variable != NULL) { + if (variable.var != NULL) { printError(name_begin, name_end, "Multiple candidates found for %.*s", (int)(name_end - name_begin), name_begin); return NULL; } - variable = var; + variable.var = var; + variable.op = 1; continue; CONTINUE_OUTER1: for (size_t i = 0; i < arguments.size; ++i) { @@ -7936,23 +7948,24 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin, goto CONTINUE_OUTER; } } - if (variable != NULL) { + if (variable.var != NULL && variable.op == 0) { printError(name_begin, name_end, "Multiple candidates found for %.*s", (int)(name_end - name_begin), name_begin); return NULL; } - variable = var; + variable.var = var; + variable.op = 0; } CONTINUE_OUTER: } } - if (variable == NULL) { + if (variable.var == NULL) { printError(name_begin, name_end, "No candidates found for %.*s", (int)(name_end - name_begin), name_begin); return NULL; } - return variable; + return variable.var; } AstTree *getShapeShifterElement(AstTreeFunctionCall *metadata, |