@@ -5871,6 +5871,7 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
5871
5871
std::string loop_src_var_name = " " ;
5872
5872
ASR::expr_t *loop_end = nullptr , *loop_start = nullptr , *inc = nullptr ;
5873
5873
ASR::expr_t *for_iter_type = nullptr ;
5874
+ ASR::expr_t *loop_src_var = nullptr ;
5874
5875
if (AST::is_a<AST::Call_t>(*x.m_iter )) {
5875
5876
AST::Call_t *c = AST::down_cast<AST::Call_t>(x.m_iter );
5876
5877
std::string call_name;
@@ -5915,6 +5916,8 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
5915
5916
5916
5917
if (ASR::is_a<ASR::Dict_t>(*loop_src_var_ttype) ||
5917
5918
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)));
5918
5921
is_explicit_iterator_required = false ;
5919
5922
for_each = true ;
5920
5923
} else {
@@ -5930,34 +5933,35 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
5930
5933
visit_Subscript (*sbt);
5931
5934
ASR::expr_t *target = ASRUtils::EXPR (tmp);
5932
5935
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;
5956
5936
if (ASR::is_a<ASR::Dict_t>(*loop_src_var_ttype) ||
5957
5937
ASR::is_a<ASR::Set_t>(*loop_src_var_ttype)) {
5938
+ loop_src_var = target;
5958
5939
is_explicit_iterator_required = false ;
5959
5940
for_each = true ;
5960
5941
} 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;
5961
5965
loop_end = for_iterable_helper (loop_src_var_name, x.base .base .loc , explicit_iter_name);
5962
5966
for_iter_type = loop_end;
5963
5967
LCOMPILERS_ASSERT (loop_end);
@@ -6070,7 +6074,6 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
6070
6074
6071
6075
if (for_each) {
6072
6076
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)));
6074
6077
tmp = ASR::make_ForEach_t (al, x.base .base .loc , target, loop_src_var, body.p , body.size ());
6075
6078
for_each = false ;
6076
6079
return ;
0 commit comments