@@ -5808,6 +5808,7 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
5808
5808
std::string loop_src_var_name = " " ;
5809
5809
ASR::expr_t *loop_end = nullptr , *loop_start = nullptr , *inc = nullptr ;
5810
5810
ASR::expr_t *for_iter_type = nullptr ;
5811
+ ASR::expr_t *loop_src_var = nullptr ;
5811
5812
if (AST::is_a<AST::Call_t>(*x.m_iter )) {
5812
5813
AST::Call_t *c = AST::down_cast<AST::Call_t>(x.m_iter );
5813
5814
std::string call_name;
@@ -5852,6 +5853,8 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
5852
5853
5853
5854
if (ASR::is_a<ASR::Dict_t>(*loop_src_var_ttype) ||
5854
5855
ASR::is_a<ASR::Set_t>(*loop_src_var_ttype)) {
5856
+ loop_src_var = ASRUtils::EXPR (
5857
+ ASR::make_Var_t (al, x.base .base .loc , current_scope->resolve_symbol (loop_src_var_name)));
5855
5858
is_explicit_iterator_required = false ;
5856
5859
for_each = true ;
5857
5860
} else {
@@ -5867,34 +5870,35 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
5867
5870
visit_Subscript (*sbt);
5868
5871
ASR::expr_t *target = ASRUtils::EXPR (tmp);
5869
5872
ASR::ttype_t *loop_src_var_ttype = ASRUtils::expr_type (target);
5870
- // Create a temporary variable that will contain the evaluated value of Subscript
5871
- std::string tmp_assign_name = current_scope->get_unique_name (" __tmp_assign_for_loop" , false );
5872
- SetChar variable_dependencies_vec;
5873
- variable_dependencies_vec.reserve (al, 1 );
5874
- ASRUtils::collect_variable_dependencies (al, variable_dependencies_vec, loop_src_var_ttype);
5875
- ASR::asr_t * tmp_assign_variable = ASR::make_Variable_t (al, sbt->base .base .loc , current_scope,
5876
- s2c (al, tmp_assign_name), variable_dependencies_vec.p , variable_dependencies_vec.size (),
5877
- ASR::intentType::Local, nullptr , nullptr , ASR::storage_typeType::Default,
5878
- loop_src_var_ttype, nullptr , ASR::abiType::Source, ASR::accessType::Public, ASR::presenceType::Required, false
5879
- );
5880
- ASR::symbol_t *tmp_assign_variable_sym = ASR::down_cast<ASR::symbol_t >(tmp_assign_variable);
5881
- current_scope->add_symbol (tmp_assign_name, tmp_assign_variable_sym);
5882
-
5883
- // Assign the Subscript expr to temporary variable
5884
- ASR::asr_t * assign = ASR::make_Assignment_t (al, x.base .base .loc ,
5885
- ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , tmp_assign_variable_sym)),
5886
- target, nullptr );
5887
- if (current_body != nullptr ) {
5888
- current_body->push_back (al, ASRUtils::STMT (assign));
5889
- } else {
5890
- global_init.push_back (al, assign);
5891
- }
5892
- loop_src_var_name = tmp_assign_name;
5893
5873
if (ASR::is_a<ASR::Dict_t>(*loop_src_var_ttype) ||
5894
5874
ASR::is_a<ASR::Set_t>(*loop_src_var_ttype)) {
5875
+ loop_src_var = target;
5895
5876
is_explicit_iterator_required = false ;
5896
5877
for_each = true ;
5897
5878
} else {
5879
+ // Create a temporary variable that will contain the evaluated value of Subscript
5880
+ std::string tmp_assign_name = current_scope->get_unique_name (" __tmp_assign_for_loop" , false );
5881
+ SetChar variable_dependencies_vec;
5882
+ variable_dependencies_vec.reserve (al, 1 );
5883
+ ASRUtils::collect_variable_dependencies (al, variable_dependencies_vec, loop_src_var_ttype);
5884
+ ASR::asr_t * tmp_assign_variable = ASR::make_Variable_t (al, sbt->base .base .loc , current_scope,
5885
+ s2c (al, tmp_assign_name), variable_dependencies_vec.p , variable_dependencies_vec.size (),
5886
+ ASR::intentType::Local, nullptr , nullptr , ASR::storage_typeType::Default,
5887
+ loop_src_var_ttype, nullptr , ASR::abiType::Source, ASR::accessType::Public, ASR::presenceType::Required, false
5888
+ );
5889
+ ASR::symbol_t *tmp_assign_variable_sym = ASR::down_cast<ASR::symbol_t >(tmp_assign_variable);
5890
+ current_scope->add_symbol (tmp_assign_name, tmp_assign_variable_sym);
5891
+
5892
+ // Assign the Subscript expr to temporary variable
5893
+ ASR::asr_t * assign = ASR::make_Assignment_t (al, x.base .base .loc ,
5894
+ ASRUtils::EXPR (ASR::make_Var_t (al, x.base .base .loc , tmp_assign_variable_sym)),
5895
+ target, nullptr );
5896
+ if (current_body != nullptr ) {
5897
+ current_body->push_back (al, ASRUtils::STMT (assign));
5898
+ } else {
5899
+ global_init.push_back (al, assign);
5900
+ }
5901
+ loop_src_var_name = tmp_assign_name;
5898
5902
loop_end = for_iterable_helper (loop_src_var_name, x.base .base .loc , explicit_iter_name);
5899
5903
for_iter_type = loop_end;
5900
5904
LCOMPILERS_ASSERT (loop_end);
@@ -6007,7 +6011,6 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
6007
6011
6008
6012
if (for_each) {
6009
6013
current_scope = parent_scope;
6010
- 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)));
6011
6014
tmp = ASR::make_ForEach_t (al, x.base .base .loc , target, loop_src_var, body.p , body.size ());
6012
6015
for_each = false ;
6013
6016
return ;
0 commit comments