@@ -1460,47 +1460,39 @@ class ArrayOpVisitor : public ASR::CallReplacerOnExpressionsVisitor<ArrayOpVisit
14601460 }
14611461
14621462 void visit_Assignment (const ASR::Assignment_t &x) {
1463- bool is_target_struct_member_array_and_value_array =
1464- (ASR::is_a<ASR::StructInstanceMember_t>(*x.m_target ) &&
1465- ASRUtils::is_array (ASRUtils::expr_type (x.m_value )) &&
1466- ASRUtils::is_array (ASRUtils::expr_type (x.m_target )) &&
1467- !ASR::is_a<ASR::FunctionCall_t>(*x.m_value ));
14681463 if ( (ASR::is_a<ASR::Pointer_t>(*ASRUtils::expr_type (x.m_target )) &&
14691464 ASR::is_a<ASR::GetPointer_t>(*x.m_value )) ||
1470- (ASR::is_a<ASR::ArrayConstant_t>(*x.m_value )) ||
1471- is_target_struct_member_array_and_value_array) { // TODO: fix for StructInstanceMember targets
1472- if ( is_target_struct_member_array_and_value_array ) {
1473- if (realloc_lhs && ASRUtils::is_allocatable (x.m_target )) { // Add realloc-lhs later
1474- Vec<ASR::alloc_arg_t > vec_alloc;
1475- vec_alloc.reserve (al, 1 );
1476- ASR::alloc_arg_t alloc_arg;
1477- alloc_arg.m_len_expr = nullptr ;
1478- alloc_arg.m_type = nullptr ;
1479- alloc_arg.loc = x.m_target ->base .loc ;
1480- alloc_arg.m_a = x.m_target ;
1481-
1482-
1483- ASR::dimension_t * m_dims = nullptr ;
1484- size_t n_dims = ASRUtils::extract_dimensions_from_ttype (
1485- ASRUtils::expr_type (x.m_value ), m_dims);
1486- Vec<ASR::dimension_t > vec_dims;
1487- vec_dims.reserve (al, n_dims);
1488- for ( size_t i = 0 ; i < n_dims; i++ ) {
1489- ASR::dimension_t dim;
1490- dim.loc = x.m_value ->base .loc ;
1491- dim.m_start = PassUtils::get_bound (x.m_value , i + 1 , " lbound" , al);
1492- dim.m_length = ASRUtils::get_size (x.m_value , i + 1 , al);
1493- vec_dims.push_back (al, dim);
1494- }
1465+ (ASR::is_a<ASR::ArrayConstant_t>(*x.m_value )) ) {
1466+ if ( realloc_lhs && ASRUtils::is_allocatable (x.m_target )) { // Add realloc-lhs later
1467+ Vec<ASR::alloc_arg_t > vec_alloc;
1468+ vec_alloc.reserve (al, 1 );
1469+ ASR::alloc_arg_t alloc_arg;
1470+ alloc_arg.m_len_expr = nullptr ;
1471+ alloc_arg.m_type = nullptr ;
1472+ alloc_arg.loc = x.m_target ->base .loc ;
1473+ alloc_arg.m_a = x.m_target ;
1474+
1475+
1476+ ASR::dimension_t * m_dims = nullptr ;
1477+ size_t n_dims = ASRUtils::extract_dimensions_from_ttype (
1478+ ASRUtils::expr_type (x.m_value ), m_dims);
1479+ Vec<ASR::dimension_t > vec_dims;
1480+ vec_dims.reserve (al, n_dims);
1481+ for ( size_t i = 0 ; i < n_dims; i++ ) {
1482+ ASR::dimension_t dim;
1483+ dim.loc = x.m_value ->base .loc ;
1484+ dim.m_start = PassUtils::get_bound (x.m_value , i + 1 , " lbound" , al);
1485+ dim.m_length = ASRUtils::get_size (x.m_value , i + 1 , al);
1486+ vec_dims.push_back (al, dim);
1487+ }
14951488
14961489
1497- alloc_arg.m_dims = vec_dims.p ;
1498- alloc_arg.n_dims = vec_dims.n ;
1499- vec_alloc.push_back (al, alloc_arg);
1500- pass_result.push_back (al, ASRUtils::STMT (ASR::make_Allocate_t (
1501- al, x.base .base .loc , vec_alloc.p , 1 , nullptr , nullptr , nullptr )));
1502- remove_original_statement = false ;
1503- }
1490+ alloc_arg.m_dims = vec_dims.p ;
1491+ alloc_arg.n_dims = vec_dims.n ;
1492+ vec_alloc.push_back (al, alloc_arg);
1493+ pass_result.push_back (al, ASRUtils::STMT (ASR::make_Allocate_t (
1494+ al, x.base .base .loc , vec_alloc.p , 1 , nullptr , nullptr , nullptr )));
1495+ remove_original_statement = false ;
15041496 }
15051497 return ;
15061498 }
0 commit comments