diff --git a/src/libasr/pass/pass_utils.h b/src/libasr/pass/pass_utils.h index 884195de25..2a34ef0f15 100644 --- a/src/libasr/pass/pass_utils.h +++ b/src/libasr/pass/pass_utils.h @@ -831,13 +831,15 @@ namespace LCompilers { s_func_type->n_arg_types = arg_types.n; s_func_type->m_return_var_type = nullptr; - Vec func_body; - func_body.reserve(al, x->n_body - 1); - for (size_t i=0; i< x->n_body - 1; i++) { - func_body.push_back(al, x->m_body[i]); + if (ASR::is_a(*x->m_body[x->n_body - 1])) { + Vec func_body; + func_body.reserve(al, x->n_body - 1); + for (size_t i=0; i< x->n_body - 1; i++) { + func_body.push_back(al, x->m_body[i]); + } + x->m_body = func_body.p; + x->n_body = func_body.n; } - x->m_body = func_body.p; - x->n_body = func_body.n; } } for (auto &item : x->m_symtab->get_scope()) { diff --git a/src/libasr/pass/replace_symbolic.cpp b/src/libasr/pass/replace_symbolic.cpp index 4464a1a1f4..cf3da1acf1 100644 --- a/src/libasr/pass/replace_symbolic.cpp +++ b/src/libasr/pass/replace_symbolic.cpp @@ -269,10 +269,16 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor(f_signature); - ASR::ttype_t *type1 = ASRUtils::TYPE(ASR::make_CPtr_t(al, xx.base.base.loc)); + ASR::ttype_t *CPtr_type = ASRUtils::TYPE(ASR::make_CPtr_t(al, xx.base.base.loc)); for (size_t i = 0; i < f_type->n_arg_types; ++i) { if (f_type->m_arg_types[i]->type == ASR::ttypeType::SymbolicExpression) { - f_type->m_arg_types[i] = type1; + f_type->m_arg_types[i] = CPtr_type; + } else if (f_type->m_arg_types[i]->type == ASR::ttypeType::List) { + ASR::List_t* list = ASR::down_cast(f_type->m_arg_types[i]); + if (list->m_type->type == ASR::ttypeType::SymbolicExpression){ + ASR::ttype_t* list_type = ASRUtils::TYPE(ASR::make_List_t(al, xx.base.base.loc, CPtr_type)); + f_type->m_arg_types[i] = list_type; + } } } @@ -592,6 +598,17 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor(*xx.m_test)) { + ASR::LogicalNot_t* logical_not = ASR::down_cast(xx.m_test); + if (ASR::is_a(*logical_not->m_arg)) { + ASR::IntrinsicScalarFunction_t* intrinsic_func = ASR::down_cast(logical_not->m_arg); + if (intrinsic_func->m_type->type == ASR::ttypeType::Logical) { + ASR::expr_t* function_call = process_attributes(xx.base.base.loc, logical_not->m_arg); + ASR::expr_t* new_logical_not = ASRUtils::EXPR(ASR::make_LogicalNot_t(al, xx.base.base.loc, function_call, + logical_not->m_type, logical_not->m_value)); + xx.m_test = new_logical_not; + } + } } }