diff --git a/integration_tests/CMakeLists.txt b/integration_tests/CMakeLists.txt index d5a477f006..694f5bd14e 100644 --- a/integration_tests/CMakeLists.txt +++ b/integration_tests/CMakeLists.txt @@ -717,6 +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 symbolics_14 LABELS cpython_sym llvm_sym NOFAST) RUN(NAME test_gruntz LABELS cpython_sym llvm_sym NOFAST) RUN(NAME sizeof_01 LABELS llvm c diff --git a/integration_tests/symbolics_14.py b/integration_tests/symbolics_14.py new file mode 100644 index 0000000000..f99ad7aa39 --- /dev/null +++ b/integration_tests/symbolics_14.py @@ -0,0 +1,15 @@ +from lpython import S +from sympy import Symbol + +def mmrv(x: S) -> list[S]: + l1: list[S] = [x] + return l1 + +def test_mrv1(): + x: S = Symbol("x") + ans: list[S] = mmrv(x) + element_1: S = ans[0] + print(element_1) + assert element_1 == x + +test_mrv1() \ No newline at end of file diff --git a/src/libasr/asr_utils.h b/src/libasr/asr_utils.h index 51337784d5..31e7d0dba1 100644 --- a/src/libasr/asr_utils.h +++ b/src/libasr/asr_utils.h @@ -4737,6 +4737,26 @@ static inline bool is_simd_array(ASR::expr_t *v) { == ASR::array_physical_typeType::SIMDArray); } +static inline bool is_argument_of_type_CPtr(ASR::expr_t *var) { + bool is_argument = false; + if (ASR::is_a(*expr_type(var))) { + if (ASR::is_a(*var)) { + ASR::symbol_t *var_sym = ASR::down_cast(var)->m_v; + if (ASR::is_a(*var_sym)) { + ASR::Variable_t *v = ASR::down_cast(var_sym); + if (v->m_intent == intent_local || + v->m_intent == intent_return_var || + !v->m_intent) { + is_argument = false; + } else { + is_argument = true; + } + } + } + } + return is_argument; +} + } // namespace ASRUtils } // namespace LCompilers diff --git a/src/libasr/codegen/asr_to_llvm.cpp b/src/libasr/codegen/asr_to_llvm.cpp index 4e447b242c..a625d6f60b 100644 --- a/src/libasr/codegen/asr_to_llvm.cpp +++ b/src/libasr/codegen/asr_to_llvm.cpp @@ -63,6 +63,7 @@ using ASRUtils::intent_local; using ASRUtils::intent_return_var; using ASRUtils::determine_module_dependencies; using ASRUtils::is_arg_dummy; +using ASRUtils::is_argument_of_type_CPtr; void string_init(llvm::LLVMContext &context, llvm::Module &module, llvm::IRBuilder<> &builder, llvm::Value* arg_size, llvm::Value* arg_string) { @@ -1245,8 +1246,12 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor llvm::Value* const_list = builder->CreateAlloca(const_list_type, nullptr, "const_list"); list_api->list_init(type_code, const_list, *module, x.n_args, x.n_args); int64_t ptr_loads_copy = ptr_loads; - ptr_loads = 1; for( size_t i = 0; i < x.n_args; i++ ) { + if (is_argument_of_type_CPtr(x.m_args[i])) { + ptr_loads = 0; + } else { + ptr_loads = 1; + } this->visit_expr(*x.m_args[i]); llvm::Value* item = tmp; llvm::Value* pos = llvm::ConstantInt::get(context, llvm::APInt(32, i));