@@ -323,7 +323,6 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
323323 func_body.from_pointer_n_copy (al, xx.m_body , xx.n_body );
324324
325325 for (ASR::symbol_t * symbol : symbolic_vars_to_free) {
326- if (symbolic_vars_to_omit.find (symbol) != symbolic_vars_to_omit.end ()) continue ;
327326 func_body.push_back (al, basic_free_stack (x.base .base .loc ,
328327 ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , symbol))));
329328 }
@@ -352,7 +351,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
352351
353352 ASR::ttype_t *CPtr_type = ASRUtils::TYPE (ASR::make_CPtr_t (al, xx.base .base .loc ));
354353 xx.m_type = CPtr_type;
355- if (var_name != " _lpython_return_variable " && xx.m_intent != ASR::intentType::Out ) {
354+ if (xx.m_intent == ASR::intentType::Local ) {
356355 symbolic_vars_to_free.insert (ASR::down_cast<ASR::symbol_t >((ASR::asr_t *)&xx));
357356 }
358357 if (xx.m_intent == ASR::intentType::In){
@@ -524,7 +523,8 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
524523 void visit_Assignment (const ASR::Assignment_t &x) {
525524 if (ASR::is_a<ASR::Var_t>(*x.m_value ) && ASR::is_a<ASR::CPtr_t>(*ASRUtils::expr_type (x.m_value ))) {
526525 ASR::symbol_t *v = ASR::down_cast<ASR::Var_t>(x.m_value )->m_v ;
527- if (symbolic_vars_to_free.find (v) == symbolic_vars_to_free.end ()) return ;
526+ if ((symbolic_vars_to_free.find (v) == symbolic_vars_to_free.end ()) &&
527+ (symbolic_vars_to_omit.find (v) == symbolic_vars_to_omit.end ())) return ;
528528 ASR::symbol_t * var_sym = ASR::down_cast<ASR::Var_t>(x.m_value )->m_v ;
529529 pass_result.push_back (al, basic_assign (x.base .base .loc , x.m_target ,
530530 ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , var_sym))));
@@ -784,7 +784,8 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
784784 ASR::expr_t * val = x.m_values [i];
785785 if (ASR::is_a<ASR::Var_t>(*val) && ASR::is_a<ASR::CPtr_t>(*ASRUtils::expr_type (val))) {
786786 ASR::symbol_t *v = ASR::down_cast<ASR::Var_t>(val)->m_v ;
787- if (symbolic_vars_to_free.find (v) == symbolic_vars_to_free.end ()) return ;
787+ if ((symbolic_vars_to_free.find (v) == symbolic_vars_to_free.end ()) &&
788+ (symbolic_vars_to_omit.find (v) == symbolic_vars_to_omit.end ())) return ;
788789 print_tmp.push_back (basic_str (x.base .base .loc , val));
789790 } else if (ASR::is_a<ASR::IntrinsicScalarFunction_t>(*val)) {
790791 ASR::IntrinsicScalarFunction_t* intrinsic_func = ASR::down_cast<ASR::IntrinsicScalarFunction_t>(val);
@@ -1007,14 +1008,12 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
10071008 }
10081009
10091010 void visit_Return (const ASR::Return_t &x) {
1011+ // freeing out variables
10101012 if (!symbolic_vars_to_free.empty ()){
10111013 for (ASR::symbol_t * symbol : symbolic_vars_to_free) {
1012- if (symbolic_vars_to_omit.find (symbol) != symbolic_vars_to_omit.end ()) continue ;
1013- // freeing out variables
10141014 pass_result.push_back (al, basic_free_stack (x.base .base .loc ,
10151015 ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , symbol))));
10161016 }
1017- symbolic_vars_to_free.clear ();
10181017 pass_result.push_back (al, ASRUtils::STMT (ASR::make_Return_t (al, x.base .base .loc )));
10191018 }
10201019 }
0 commit comments