@@ -1124,6 +1124,24 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
1124
1124
}
1125
1125
1126
1126
1127
+ ASR::asr_t * make_dummy_assignment (ASR::expr_t * expr) {
1128
+ ASR::ttype_t * type = ASRUtils::expr_type (expr);
1129
+ std::string dummy_ret_name = current_scope->get_unique_name (" __lcompilers_dummy" , false );
1130
+ SetChar variable_dependencies_vec;
1131
+ variable_dependencies_vec.reserve (al, 1 );
1132
+ ASRUtils::collect_variable_dependencies (al, variable_dependencies_vec, type);
1133
+ ASR::asr_t * variable_asr = ASR::make_Variable_t (al, expr->base .loc , current_scope,
1134
+ s2c (al, dummy_ret_name), variable_dependencies_vec.p ,
1135
+ variable_dependencies_vec.size (), ASR::intentType::Local,
1136
+ nullptr , nullptr , ASR::storage_typeType::Default,
1137
+ type, nullptr , ASR::abiType::Source, ASR::accessType::Public,
1138
+ ASR::presenceType::Required, false );
1139
+ ASR::symbol_t * variable_sym = ASR::down_cast<ASR::symbol_t >(variable_asr);
1140
+ current_scope->add_symbol (dummy_ret_name, variable_sym);
1141
+ ASR::expr_t * variable_var = ASRUtils::EXPR (ASR::make_Var_t (al, expr->base .loc , variable_sym));
1142
+ return ASR::make_Assignment_t (al, expr->base .loc , variable_var, expr, nullptr );
1143
+ }
1144
+
1127
1145
// Function to create appropriate call based on symbol type. If it is external
1128
1146
// generic symbol then it changes the name accordingly.
1129
1147
ASR::asr_t * make_call_helper (Allocator &al, ASR::symbol_t * s, SymbolTable *current_scope,
@@ -1290,20 +1308,7 @@ class CommonVisitor : public AST::BaseVisitor<Struct> {
1290
1308
s_generic, args_new.p , args_new.size (),
1291
1309
a_type, value, nullptr );
1292
1310
if ( ignore_return_value ) {
1293
- std::string dummy_ret_name = current_scope->get_unique_name (" __lcompilers_dummy" , false );
1294
- SetChar variable_dependencies_vec;
1295
- variable_dependencies_vec.reserve (al, 1 );
1296
- ASRUtils::collect_variable_dependencies (al, variable_dependencies_vec, a_type);
1297
- ASR::asr_t * variable_asr = ASR::make_Variable_t (al, loc, current_scope,
1298
- s2c (al, dummy_ret_name), variable_dependencies_vec.p ,
1299
- variable_dependencies_vec.size (), ASR::intentType::Local,
1300
- nullptr , nullptr , ASR::storage_typeType::Default,
1301
- a_type, nullptr , ASR::abiType::Source, ASR::accessType::Public,
1302
- ASR::presenceType::Required, false );
1303
- ASR::symbol_t * variable_sym = ASR::down_cast<ASR::symbol_t >(variable_asr);
1304
- current_scope->add_symbol (dummy_ret_name, variable_sym);
1305
- ASR::expr_t * variable_var = ASRUtils::EXPR (ASR::make_Var_t (al, loc, variable_sym));
1306
- return ASR::make_Assignment_t (al, loc, variable_var, ASRUtils::EXPR (func_call_asr), nullptr );
1311
+ return make_dummy_assignment (ASRUtils::EXPR (func_call_asr));
1307
1312
} else {
1308
1313
return func_call_asr;
1309
1314
}
@@ -4724,11 +4729,17 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
4724
4729
// Visit the statement
4725
4730
this ->visit_stmt (*m_body[i]);
4726
4731
if (tmp != nullptr ) {
4732
+ if (ASR::is_a<ASR::expr_t >(*tmp)) {
4733
+ tmp = make_dummy_assignment (ASRUtils::EXPR (tmp));
4734
+ }
4727
4735
ASR::stmt_t * tmp_stmt = ASRUtils::STMT (tmp);
4728
4736
body.push_back (al, tmp_stmt);
4729
4737
} else if (!tmp_vec.empty ()) {
4730
4738
for (auto t: tmp_vec) {
4731
4739
if (t != nullptr ) {
4740
+ if (ASR::is_a<ASR::expr_t >(*t)) {
4741
+ t = make_dummy_assignment (ASRUtils::EXPR (t));
4742
+ }
4732
4743
ASR::stmt_t * tmp_stmt = ASRUtils::STMT (t);
4733
4744
body.push_back (al, tmp_stmt);
4734
4745
}
0 commit comments