diff --git a/integration_tests/CMakeLists.txt b/integration_tests/CMakeLists.txt index d5a477f006..b0dac2be81 100644 --- a/integration_tests/CMakeLists.txt +++ b/integration_tests/CMakeLists.txt @@ -717,7 +717,7 @@ RUN(NAME symbolics_10 LABELS cpython_sym c_sym llvm_sym NOFAST) RUN(NAME symbolics_11 LABELS cpython_sym c_sym llvm_sym NOFAST) RUN(NAME symbolics_12 LABELS cpython_sym c_sym llvm_sym NOFAST) RUN(NAME symbolics_13 LABELS cpython_sym c_sym llvm_sym NOFAST) -RUN(NAME test_gruntz LABELS cpython_sym llvm_sym NOFAST) +RUN(NAME test_gruntz LABELS cpython_sym c_sym llvm_sym NOFAST) RUN(NAME sizeof_01 LABELS llvm c EXTRAFILES sizeof_01b.c) diff --git a/src/libasr/codegen/asr_to_c.cpp b/src/libasr/codegen/asr_to_c.cpp index c39fc2990f..bae0a5e7d4 100644 --- a/src/libasr/codegen/asr_to_c.cpp +++ b/src/libasr/codegen/asr_to_c.cpp @@ -415,11 +415,6 @@ class ASRToCVisitor : public BaseCCPPVisitor headers.insert("complex.h"); convert_variable_decl_util(v, is_array, declare_as_constant, use_ref, dummy, force_declare, force_declare_name, n_dims, m_dims, v_m_type, dims, sub); - } else if (ASR::is_a(*v_m_type)) { - headers.insert("symengine/cwrapper.h"); - std::string type_name = "basic"; - std::string v_m_name = v.m_name; - sub = format_type_c("", type_name, v_m_name, use_ref, dummy); } else if (ASRUtils::is_logical(*v_m_type)) { convert_variable_decl_util(v, is_array, declare_as_constant, use_ref, dummy, force_declare, force_declare_name, n_dims, m_dims, v_m_type, dims, sub); @@ -529,7 +524,12 @@ class ASRToCVisitor : public BaseCCPPVisitor } else if (ASR::is_a(*v_m_type)) { ASR::List_t* t = ASR::down_cast(v_m_type); std::string list_type_c = c_ds_api->get_list_type(t); - sub = format_type_c("", list_type_c, v.m_name, + std::string name = v.m_name; + if (name == "_lpython_return_variable" && v.m_intent == ASRUtils::intent_out) { + is_return_var_intent_out = true; + name = "*" + name; + } + sub = format_type_c("", list_type_c, name, false, false); } else if (ASR::is_a(*v_m_type)) { ASR::Tuple_t* t = ASR::down_cast(v_m_type); diff --git a/src/libasr/codegen/asr_to_c_cpp.h b/src/libasr/codegen/asr_to_c_cpp.h index e7dbd05a3f..89874c9677 100644 --- a/src/libasr/codegen/asr_to_c_cpp.h +++ b/src/libasr/codegen/asr_to_c_cpp.h @@ -148,6 +148,8 @@ class BaseCCPPVisitor : public ASR::BaseVisitor SymbolTable* current_scope; bool is_string_concat_present; + bool is_return_var_intent_out = false; + BaseCCPPVisitor(diag::Diagnostics &diag, Platform &platform, CompilerOptions &_compiler_options, bool gen_stdstring, bool gen_stdcomplex, bool is_c, int64_t default_lower_bound) : diag{diag}, @@ -1077,6 +1079,16 @@ PyMODINIT_FUNC PyInit_lpython_module_)" + fn_name + R"((void) { || param->m_intent == ASRUtils::intent_out) && !ASRUtils::is_aggregate_type(param->m_type))) { args += "&" + src; + } else if (std::string(param->m_name) == "_lpython_return_variable" + && param->m_intent == ASRUtils::intent_out) { + if (ASR::is_a(*param->m_type)) { + ASR::List_t* list_type = ASR::down_cast(param->m_type); + if (list_type->m_type->type == ASR::ttypeType::CPtr){ + args += "&" + src; + } + } else { + args += src; + } } else { args += src; } @@ -1367,7 +1379,12 @@ PyMODINIT_FUNC PyInit_lpython_module_)" + fn_name + R"((void) { if( is_target_list && is_value_list ) { ASR::List_t* list_target = ASR::down_cast(ASRUtils::expr_type(x.m_target)); std::string list_dc_func = c_ds_api->get_list_deepcopy_func(list_target); - src += indent + list_dc_func + "(&" + value + ", &" + target + ");\n\n"; + if (target == "_lpython_return_variable" && is_return_var_intent_out) { + src += indent + list_dc_func + "(&" + value + ", " + target + ");\n\n"; + is_return_var_intent_out = false; + } else { + src += indent + list_dc_func + "(&" + value + ", &" + target + ");\n\n"; + } } else if ( is_target_tup && is_value_tup ) { ASR::Tuple_t* tup_target = ASR::down_cast(ASRUtils::expr_type(x.m_target)); std::string dc_func = c_ds_api->get_tuple_deepcopy_func(tup_target);