@@ -148,6 +148,19 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
148148 return SubroutineCall (loc, basic_free_stack_sym, {x});
149149 }
150150
151+ ASR::stmt_t *basic_free_stack_if_not_null (const Location &loc, ASR::expr_t *x) {
152+ Vec<ASR::stmt_t *> func_body;
153+ func_body.reserve (al, 1 );
154+ func_body.push_back (al, basic_free_stack (loc, x));
155+ ASR::ttype_t *CPtr_type = ASRUtils::TYPE (ASR::make_CPtr_t (al, loc));
156+ ASR::ttype_t *Logical_type = ASRUtils::TYPE (ASR::make_Logical_t (al, loc, 4 ));
157+ ASR::expr_t * null = ASRUtils::EXPR (ASR::make_PointerNullConstant_t (al, loc, CPtr_type));
158+ ASR::expr_t * cond = ASRUtils::EXPR (ASR::make_CPtrCompare_t (al, loc, x, ASR::cmpopType::NotEq,
159+ null, Logical_type, nullptr ));
160+ return ASRUtils::STMT (ASR::make_If_t (al, loc, cond,
161+ func_body.p , func_body.size (), nullptr , 0 ));
162+ }
163+
151164 ASR::expr_t *basic_new_heap (const Location& loc) {
152165 ASR::symbol_t * basic_new_heap_sym = create_bindc_function (loc,
153166 " basic_new_heap" , {}, ASRUtils::TYPE ((ASR::make_CPtr_t (al, loc))));
@@ -324,7 +337,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
324337 func_body.from_pointer_n_copy (al, xx.m_body , xx.n_body );
325338
326339 for (ASR::symbol_t * symbol : symbolic_vars_to_free) {
327- func_body.push_back (al, basic_free_stack (x.base .base .loc ,
340+ func_body.push_back (al, basic_free_stack_if_not_null (x.base .base .loc ,
328341 ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , symbol))));
329342 }
330343
@@ -1027,7 +1040,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
10271040 // freeing out variables
10281041 if (!symbolic_vars_to_free.empty ()){
10291042 for (ASR::symbol_t * symbol : symbolic_vars_to_free) {
1030- pass_result.push_back (al, basic_free_stack (x.base .base .loc ,
1043+ pass_result.push_back (al, basic_free_stack_if_not_null (x.base .base .loc ,
10311044 ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , symbol))));
10321045 }
10331046 pass_result.push_back (al, ASRUtils::STMT (ASR::make_Return_t (al, x.base .base .loc )));
0 commit comments