Skip to content

Commit f017d9b

Browse files
committed
add overload support in Call
1 parent d2e7397 commit f017d9b

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

src/lpython/semantics/python_ast_to_asr.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -952,7 +952,12 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
952952
ASR::symbol_t* overloaddef_find_helper(std::string func_name, Vec<ASR::ttype_t*> args,
953953
const Location &loc) {
954954
for(auto &t: overload_defs[func_name]) {
955-
ASR::symbol_t *st = current_scope->scope[t];
955+
SymbolTable *symtab = current_scope;
956+
while (symtab!= nullptr && symtab->scope.find(t) == symtab->scope.end()) {
957+
symtab = symtab->parent;
958+
}
959+
LFORTRAN_ASSERT(symtab != nullptr);
960+
ASR::symbol_t *st = symtab->scope[t];
956961
bool ok = select_func_subrout(st, args, loc,
957962
[&](const std::string &msg, const Location &l) { throw SemanticError(msg, l); });
958963
if (ok) {
@@ -2256,6 +2261,14 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
22562261

22572262
ASR::symbol_t *s = current_scope->resolve_symbol(call_name);
22582263

2264+
if (!s && overload_defs.find(call_name)!=overload_defs.end()) {
2265+
Vec<ASR::ttype_t*> args_type;
2266+
args_type.reserve(al, x.n_args);
2267+
for(size_t i=0; i<x.n_args; i++) {
2268+
args_type.push_back(al, ASRUtils::expr_type(args[i]));
2269+
}
2270+
s = overloaddef_find_helper(call_name, args_type, x.base.base.loc);
2271+
}
22592272

22602273
if (!s) {
22612274
if (intrinsic_procedures.is_intrinsic(call_name)) {

0 commit comments

Comments
 (0)