Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f9ab31e

Browse files
authored
Fixed output through c_sym backend for test_gruntz.py (#2454)
1 parent 1652163 commit f9ab31e

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

integration_tests/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,7 @@ RUN(NAME symbolics_11 LABELS cpython_sym c_sym llvm_sym NOFAST)
718718
RUN(NAME symbolics_12 LABELS cpython_sym c_sym llvm_sym NOFAST)
719719
RUN(NAME symbolics_13 LABELS cpython_sym c_sym llvm_sym NOFAST)
720720
RUN(NAME symbolics_14 LABELS cpython_sym llvm_sym NOFAST)
721-
RUN(NAME test_gruntz LABELS cpython_sym llvm_sym NOFAST)
721+
RUN(NAME test_gruntz LABELS cpython_sym c_sym llvm_sym NOFAST)
722722

723723
RUN(NAME sizeof_01 LABELS llvm c
724724
EXTRAFILES sizeof_01b.c)

src/libasr/codegen/asr_to_c.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -415,11 +415,6 @@ class ASRToCVisitor : public BaseCCPPVisitor<ASRToCVisitor>
415415
headers.insert("complex.h");
416416
convert_variable_decl_util(v, is_array, declare_as_constant, use_ref, dummy,
417417
force_declare, force_declare_name, n_dims, m_dims, v_m_type, dims, sub);
418-
} else if (ASR::is_a<ASR::SymbolicExpression_t>(*v_m_type)) {
419-
headers.insert("symengine/cwrapper.h");
420-
std::string type_name = "basic";
421-
std::string v_m_name = v.m_name;
422-
sub = format_type_c("", type_name, v_m_name, use_ref, dummy);
423418
} else if (ASRUtils::is_logical(*v_m_type)) {
424419
convert_variable_decl_util(v, is_array, declare_as_constant, use_ref, dummy,
425420
force_declare, force_declare_name, n_dims, m_dims, v_m_type, dims, sub);
@@ -529,7 +524,11 @@ class ASRToCVisitor : public BaseCCPPVisitor<ASRToCVisitor>
529524
} else if (ASR::is_a<ASR::List_t>(*v_m_type)) {
530525
ASR::List_t* t = ASR::down_cast<ASR::List_t>(v_m_type);
531526
std::string list_type_c = c_ds_api->get_list_type(t);
532-
sub = format_type_c("", list_type_c, v.m_name,
527+
std::string name = v.m_name;
528+
if (v.m_intent == ASRUtils::intent_out) {
529+
name = "*" + name;
530+
}
531+
sub = format_type_c("", list_type_c, name,
533532
false, false);
534533
} else if (ASR::is_a<ASR::Tuple_t>(*v_m_type)) {
535534
ASR::Tuple_t* t = ASR::down_cast<ASR::Tuple_t>(v_m_type);

src/libasr/codegen/asr_to_c_cpp.h

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1077,6 +1077,15 @@ PyMODINIT_FUNC PyInit_lpython_module_)" + fn_name + R"((void) {
10771077
|| param->m_intent == ASRUtils::intent_out)
10781078
&& !ASRUtils::is_aggregate_type(param->m_type))) {
10791079
args += "&" + src;
1080+
} else if (param->m_intent == ASRUtils::intent_out) {
1081+
if (ASR::is_a<ASR::List_t>(*param->m_type)) {
1082+
ASR::List_t* list_type = ASR::down_cast<ASR::List_t>(param->m_type);
1083+
if (list_type->m_type->type == ASR::ttypeType::CPtr){
1084+
args += "&" + src;
1085+
}
1086+
} else {
1087+
args += src;
1088+
}
10801089
} else {
10811090
args += src;
10821091
}
@@ -1367,7 +1376,19 @@ PyMODINIT_FUNC PyInit_lpython_module_)" + fn_name + R"((void) {
13671376
if( is_target_list && is_value_list ) {
13681377
ASR::List_t* list_target = ASR::down_cast<ASR::List_t>(ASRUtils::expr_type(x.m_target));
13691378
std::string list_dc_func = c_ds_api->get_list_deepcopy_func(list_target);
1370-
src += indent + list_dc_func + "(&" + value + ", &" + target + ");\n\n";
1379+
if (ASR::is_a<ASR::Var_t>(*x.m_target)) {
1380+
ASR::symbol_t *target_sym = ASR::down_cast<ASR::Var_t>(x.m_target)->m_v;
1381+
if (ASR::is_a<ASR::Variable_t>(*target_sym)) {
1382+
ASR::Variable_t *v = ASR::down_cast<ASR::Variable_t>(target_sym);
1383+
if (v->m_intent == ASRUtils::intent_out) {
1384+
src += indent + list_dc_func + "(&" + value + ", " + target + ");\n\n";
1385+
} else {
1386+
src += indent + list_dc_func + "(&" + value + ", &" + target + ");\n\n";
1387+
}
1388+
}
1389+
} else {
1390+
src += indent + list_dc_func + "(&" + value + ", &" + target + ");\n\n";
1391+
}
13711392
} else if ( is_target_tup && is_value_tup ) {
13721393
ASR::Tuple_t* tup_target = ASR::down_cast<ASR::Tuple_t>(ASRUtils::expr_type(x.m_target));
13731394
std::string dc_func = c_ds_api->get_tuple_deepcopy_func(tup_target);

0 commit comments

Comments
 (0)