@@ -5871,6 +5871,7 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
58715871 std::string loop_src_var_name = " " ;
58725872 ASR::expr_t *loop_end = nullptr , *loop_start = nullptr , *inc = nullptr ;
58735873 ASR::expr_t *for_iter_type = nullptr ;
5874+ ASR::expr_t *loop_src_var = nullptr ;
58745875 if (AST::is_a<AST::Call_t>(*x.m_iter )) {
58755876 AST::Call_t *c = AST::down_cast<AST::Call_t>(x.m_iter );
58765877 std::string call_name;
@@ -5915,6 +5916,8 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
59155916
59165917 if (ASR::is_a<ASR::Dict_t>(*loop_src_var_ttype) ||
59175918 ASR::is_a<ASR::Set_t>(*loop_src_var_ttype)) {
5919+ loop_src_var = ASRUtils::EXPR (
5920+ ASR::make_Var_t (al, x.base .base .loc , current_scope->resolve_symbol (loop_src_var_name)));
59185921 is_explicit_iterator_required = false ;
59195922 for_each = true ;
59205923 } else {
@@ -5930,34 +5933,35 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
59305933 visit_Subscript (*sbt);
59315934 ASR::expr_t *target = ASRUtils::EXPR (tmp);
59325935 ASR::ttype_t *loop_src_var_ttype = ASRUtils::expr_type (target);
5933- // Create a temporary variable that will contain the evaluated value of Subscript
5934- std::string tmp_assign_name = current_scope->get_unique_name (" __tmp_assign_for_loop" , false );
5935- SetChar variable_dependencies_vec;
5936- variable_dependencies_vec.reserve (al, 1 );
5937- ASRUtils::collect_variable_dependencies (al, variable_dependencies_vec, loop_src_var_ttype);
5938- ASR::asr_t * tmp_assign_variable = ASR::make_Variable_t (al, sbt->base .base .loc , current_scope,
5939- s2c (al, tmp_assign_name), variable_dependencies_vec.p , variable_dependencies_vec.size (),
5940- ASR::intentType::Local, nullptr , nullptr , ASR::storage_typeType::Default,
5941- loop_src_var_ttype, nullptr , ASR::abiType::Source, ASR::accessType::Public, ASR::presenceType::Required, false
5942- );
5943- ASR::symbol_t *tmp_assign_variable_sym = ASR::down_cast<ASR::symbol_t >(tmp_assign_variable);
5944- current_scope->add_symbol (tmp_assign_name, tmp_assign_variable_sym);
5945-
5946- // Assign the Subscript expr to temporary variable
5947- ASR::asr_t * assign = ASR::make_Assignment_t (al, x.base .base .loc ,
5948- ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , tmp_assign_variable_sym)),
5949- target, nullptr );
5950- if (current_body != nullptr ) {
5951- current_body->push_back (al, ASRUtils::STMT (assign));
5952- } else {
5953- global_init.push_back (al, assign);
5954- }
5955- loop_src_var_name = tmp_assign_name;
59565936 if (ASR::is_a<ASR::Dict_t>(*loop_src_var_ttype) ||
59575937 ASR::is_a<ASR::Set_t>(*loop_src_var_ttype)) {
5938+ loop_src_var = target;
59585939 is_explicit_iterator_required = false ;
59595940 for_each = true ;
59605941 } else {
5942+ // Create a temporary variable that will contain the evaluated value of Subscript
5943+ std::string tmp_assign_name = current_scope->get_unique_name (" __tmp_assign_for_loop" , false );
5944+ SetChar variable_dependencies_vec;
5945+ variable_dependencies_vec.reserve (al, 1 );
5946+ ASRUtils::collect_variable_dependencies (al, variable_dependencies_vec, loop_src_var_ttype);
5947+ ASR::asr_t * tmp_assign_variable = ASR::make_Variable_t (al, sbt->base .base .loc , current_scope,
5948+ s2c (al, tmp_assign_name), variable_dependencies_vec.p , variable_dependencies_vec.size (),
5949+ ASR::intentType::Local, nullptr , nullptr , ASR::storage_typeType::Default,
5950+ loop_src_var_ttype, nullptr , ASR::abiType::Source, ASR::accessType::Public, ASR::presenceType::Required, false
5951+ );
5952+ ASR::symbol_t *tmp_assign_variable_sym = ASR::down_cast<ASR::symbol_t >(tmp_assign_variable);
5953+ current_scope->add_symbol (tmp_assign_name, tmp_assign_variable_sym);
5954+
5955+ // Assign the Subscript expr to temporary variable
5956+ ASR::asr_t * assign = ASR::make_Assignment_t (al, x.base .base .loc ,
5957+ ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , tmp_assign_variable_sym)),
5958+ target, nullptr );
5959+ if (current_body != nullptr ) {
5960+ current_body->push_back (al, ASRUtils::STMT (assign));
5961+ } else {
5962+ global_init.push_back (al, assign);
5963+ }
5964+ loop_src_var_name = tmp_assign_name;
59615965 loop_end = for_iterable_helper (loop_src_var_name, x.base .base .loc , explicit_iter_name);
59625966 for_iter_type = loop_end;
59635967 LCOMPILERS_ASSERT (loop_end);
@@ -6070,7 +6074,6 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
60706074
60716075 if (for_each) {
60726076 current_scope = parent_scope;
6073- ASR::expr_t * loop_src_var = ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , current_scope->resolve_symbol (loop_src_var_name)));
60746077 tmp = ASR::make_ForEach_t (al, x.base .base .loc , target, loop_src_var, body.p , body.size ());
60756078 for_each = false ;
60766079 return ;
0 commit comments