From c0dd73256be4ddf1819fe2a3cc82136962789dbf Mon Sep 17 00:00:00 2001 From: Tanay Manerikar Date: Sun, 21 Jul 2024 22:49:40 +0530 Subject: [PATCH] Fixed copy semantics of objects --- src/libasr/codegen/llvm_utils.cpp | 3 +- src/lpython/semantics/python_ast_to_asr.cpp | 45 ++++++++++++--------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/libasr/codegen/llvm_utils.cpp b/src/libasr/codegen/llvm_utils.cpp index 9ba3acfe10..c49640329f 100644 --- a/src/libasr/codegen/llvm_utils.cpp +++ b/src/libasr/codegen/llvm_utils.cpp @@ -1960,7 +1960,8 @@ namespace LCompilers { while( struct_type_t != nullptr ) { for( auto item: struct_type_t->m_symtab->get_scope() ) { if( ASR::is_a(*item.second) || - ASR::is_a(*item.second) ) { + ASR::is_a(*item.second) || + ASR::is_a(*item.second) ) { continue ; } std::string mem_name = item.first; diff --git a/src/lpython/semantics/python_ast_to_asr.cpp b/src/lpython/semantics/python_ast_to_asr.cpp index dd61ef6fdf..2f24e77e04 100644 --- a/src/lpython/semantics/python_ast_to_asr.cpp +++ b/src/lpython/semantics/python_ast_to_asr.cpp @@ -5255,24 +5255,26 @@ class BodyVisitor : public CommonVisitor { if ( sym && ASR::is_a(*sym) ) { ASR::Variable_t* var = ASR::down_cast(sym); if ( ASR::is_a(*(var->m_type)) && - !ASR::down_cast((var->m_type))->m_is_cstruct && - ASR::is_a(*init_expr) ) { - AST::Call_t* call = AST::down_cast(x.m_value); - if ( call->n_keywords>0 ) { - throw SemanticError("Kwargs not implemented yet", x.base.base.loc); - } - Vec args; - args.reserve(al, call->n_args + 1); - ASR::call_arg_t self_arg; - self_arg.loc = x.base.base.loc; - self_arg.m_value = ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, sym)); - args.push_back(al, self_arg); - visit_expr_list(call->m_args, call->n_args, args); - ASR::symbol_t* der = ASR::down_cast((var->m_type))->m_derived_type; - std::string call_name = "__init__"; - ASR::symbol_t* call_sym = get_struct_member(der, call_name, x.base.base.loc); - tmp = make_call_helper(al, call_sym, current_scope, args, call_name, x.base.base.loc); + !ASR::down_cast((var->m_type))->m_is_cstruct ) { + if ( !ASR::is_a(*init_expr) ) { + throw SemanticError("References are not implemented", x.base.base.loc); + } + AST::Call_t* call = AST::down_cast(x.m_value); + if ( call->n_keywords>0 ) { + throw SemanticError("Kwargs not implemented yet", x.base.base.loc); } + Vec args; + args.reserve(al, call->n_args + 1); + ASR::call_arg_t self_arg; + self_arg.loc = x.base.base.loc; + self_arg.m_value = ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, sym)); + args.push_back(al, self_arg); + visit_expr_list(call->m_args, call->n_args, args); + ASR::symbol_t* der = ASR::down_cast((var->m_type))->m_derived_type; + std::string call_name = "__init__"; + ASR::symbol_t* call_sym = get_struct_member(der, call_name, x.base.base.loc); + tmp = make_call_helper(al, call_sym, current_scope, args, call_name, x.base.base.loc); + } } } @@ -5539,11 +5541,18 @@ class BodyVisitor : public CommonVisitor { if (target->type == ASR::exprType::Var) { ASR::Var_t *var = ASR::down_cast(target); ASR::symbol_t *sym = var->m_v; + ASR::Variable_t *v = ASR::down_cast(sym); if (do_loop_variables.size() > 0 && std::find(do_loop_variables.begin(), do_loop_variables.end(), sym) != do_loop_variables.end()) { - ASR::Variable_t *v = ASR::down_cast(sym); std::string var_name = std::string(v->m_name); throw SemanticError("Assignment to loop variable `" + std::string(to_lower(var_name)) +"` is not allowed", target->base.loc); } + if ( ASR::is_a(*(v->m_type)) && + !ASR::down_cast((v->m_type))->m_is_cstruct && + !(tmp_value->type == ASR::exprType::StructConstructor) ) { + ASR::Variable_t *v = ASR::down_cast(sym); + std::string var_name = std::string(v->m_name); + throw SemanticError("References are not implemented", target->base.loc); + } } tmp_vec.push_back(ASR::make_Assignment_t(al, x.base.base.loc, target, tmp_value, overloaded));