@@ -148,6 +148,19 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
148
148
return SubroutineCall (loc, basic_free_stack_sym, {x});
149
149
}
150
150
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
+
151
164
ASR::expr_t *basic_new_heap (const Location& loc) {
152
165
ASR::symbol_t * basic_new_heap_sym = create_bindc_function (loc,
153
166
" basic_new_heap" , {}, ASRUtils::TYPE ((ASR::make_CPtr_t (al, loc))));
@@ -324,7 +337,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
324
337
func_body.from_pointer_n_copy (al, xx.m_body , xx.n_body );
325
338
326
339
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 ,
328
341
ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , symbol))));
329
342
}
330
343
@@ -1027,7 +1040,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi
1027
1040
// freeing out variables
1028
1041
if (!symbolic_vars_to_free.empty ()){
1029
1042
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 ,
1031
1044
ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , symbol))));
1032
1045
}
1033
1046
pass_result.push_back (al, ASRUtils::STMT (ASR::make_Return_t (al, x.base .base .loc )));
0 commit comments