From b324e36e961ec973d413ea9598434a332b14a40a Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Fri, 1 Jul 2022 19:02:19 +0530 Subject: [PATCH 01/13] Add simple test for verifying arrays of structs --- integration_tests/structs_05.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 integration_tests/structs_05.py diff --git a/integration_tests/structs_05.py b/integration_tests/structs_05.py new file mode 100644 index 0000000000..bba45763b4 --- /dev/null +++ b/integration_tests/structs_05.py @@ -0,0 +1,22 @@ +from ltypes import i32, f64, dataclass + +@dataclass +class A: + y: f64 + x: i32 + +def g(): + y: A[2] + eps: f64 = 1e-12 + y[0].x = 1 + y[0].y = 1.1 + y[1].x = 2 + y[1].y = 2.2 + print(y[0].x, y[0].y) + assert y[0].x == 1 + assert abs(y[0].y - 1.1) < eps + print(y[1].x, y[1].y) + assert y[1].x == 2 + assert abs(y[1].y - 2.2) < eps + +g() From 473d48b8a4051fcacff4d28a572f6ede3ca3a6b9 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Fri, 1 Jul 2022 19:03:14 +0530 Subject: [PATCH 02/13] Support referencing arrays of structs and then their members --- src/lpython/semantics/python_ast_to_asr.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lpython/semantics/python_ast_to_asr.cpp b/src/lpython/semantics/python_ast_to_asr.cpp index 4ec54db0d9..14f9d3a2de 100644 --- a/src/lpython/semantics/python_ast_to_asr.cpp +++ b/src/lpython/semantics/python_ast_to_asr.cpp @@ -2819,6 +2819,11 @@ class BodyVisitor : public CommonVisitor { visit_Attribute(*x_m_value); ASR::expr_t* e = ASRUtils::EXPR(tmp); visit_AttributeUtil(ASRUtils::expr_type(e), x.m_attr, e, x.base.base.loc); + } else if(AST::is_a(*x.m_value)) { + AST::Subscript_t* x_m_value = AST::down_cast(x.m_value); + visit_Subscript(*x_m_value); + ASR::expr_t* e = ASRUtils::EXPR(tmp); + visit_AttributeUtil(ASRUtils::expr_type(e), x.m_attr, e, x.base.base.loc); } else { throw SemanticError("Only Name, Attribute is supported for now in Attribute", x.base.base.loc); From 772eda6df1fbf11df7e05eabefc705fcfc12584c Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Fri, 1 Jul 2022 19:03:44 +0530 Subject: [PATCH 03/13] Set der_type_name in ArrayRef --- src/libasr/codegen/asr_to_llvm.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libasr/codegen/asr_to_llvm.cpp b/src/libasr/codegen/asr_to_llvm.cpp index bbbc1315d6..c7c45185b7 100644 --- a/src/libasr/codegen/asr_to_llvm.cpp +++ b/src/libasr/codegen/asr_to_llvm.cpp @@ -1160,6 +1160,10 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor return; } ASR::Variable_t *v = ASR::down_cast(x.m_v); + if( ASR::is_a(*v->m_type) ) { + ASR::Derived_t* der_type = ASR::down_cast(v->m_type); + der_type_name = ASRUtils::symbol_name(ASRUtils::symbol_get_past_external(der_type->m_derived_type)); + } uint32_t v_h = get_hash((ASR::asr_t*)v); LFORTRAN_ASSERT(llvm_symtab.find(v_h) != llvm_symtab.end()); llvm::Value* array = llvm_symtab[v_h]; From b9f070f8b2e15e8f25d420ab9054da6b7b0939d3 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Fri, 1 Jul 2022 19:04:53 +0530 Subject: [PATCH 04/13] Add structs_05 to integration_tests with C and LLVM backends --- integration_tests/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/integration_tests/CMakeLists.txt b/integration_tests/CMakeLists.txt index aebf082425..7d7564dcea 100644 --- a/integration_tests/CMakeLists.txt +++ b/integration_tests/CMakeLists.txt @@ -183,6 +183,7 @@ RUN(NAME structs_01 LABELS cpython llvm c) RUN(NAME structs_02 LABELS llvm c) RUN(NAME structs_03 LABELS llvm c) RUN(NAME structs_04 LABELS cpython llvm c) +RUN(NAME structs_05 LABELS llvm c) RUN(NAME test_str_to_int LABELS cpython llvm) RUN(NAME test_platform LABELS cpython llvm) RUN(NAME test_vars_01 LABELS cpython llvm) From 6383c555cfcf8457f3d39894b96bae44c3eca69d Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Fri, 1 Jul 2022 19:05:06 +0530 Subject: [PATCH 05/13] Ignore generated files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9b60d8f5cc..1c4601ec17 100644 --- a/.gitignore +++ b/.gitignore @@ -188,5 +188,6 @@ integration_tests/structs_02 integration_tests/structs_02.c integration_tests/structs_03 integration_tests/structs_03.c +integration_tests/structs_05.c integration_tests/expr_08 integration_tests/expr_08.c From cadfa883b6d72c6f0227599eaa975810e667e2f1 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Fri, 1 Jul 2022 19:48:54 +0530 Subject: [PATCH 06/13] Initialise dataclasses before using them --- integration_tests/structs_05.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/integration_tests/structs_05.py b/integration_tests/structs_05.py index bba45763b4..a52ec316e1 100644 --- a/integration_tests/structs_05.py +++ b/integration_tests/structs_05.py @@ -6,17 +6,27 @@ class A: x: i32 def g(): + # TODO: Replace y: A[2] with y: A[2] = [None, None] + # TODO: And enable cpython in integration_tests. y: A[2] - eps: f64 = 1e-12 - y[0].x = 1 - y[0].y = 1.1 - y[1].x = 2 - y[1].y = 2.2 + y[0] = A(1.1, 1) + y[1] = A(2.2, 2) print(y[0].x, y[0].y) assert y[0].x == 1 - assert abs(y[0].y - 1.1) < eps + assert y[0].y == 1.1 print(y[1].x, y[1].y) assert y[1].x == 2 - assert abs(y[1].y - 2.2) < eps + assert y[1].y == 2.2 + eps: f64 = 1e-12 + y[0].x = 2 + y[0].y = 1.2 + y[1].x = 3 + y[1].y = 2.3 + print(y[0].x, y[0].y) + assert y[0].x == 2 + assert abs(y[0].y - 1.2) < eps + print(y[1].x, y[1].y) + assert y[1].x == 3 + assert abs(y[1].y - 2.3) < eps g() From 616236914916bf7e330dddd6f81fa9d3b0cae220 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Fri, 1 Jul 2022 19:49:49 +0530 Subject: [PATCH 07/13] Added support for struct arrays in C backend --- src/libasr/codegen/asr_to_c.cpp | 8 ++++++-- src/libasr/codegen/asr_to_c_cpp.h | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/libasr/codegen/asr_to_c.cpp b/src/libasr/codegen/asr_to_c.cpp index 753d6a0047..f88444a643 100644 --- a/src/libasr/codegen/asr_to_c.cpp +++ b/src/libasr/codegen/asr_to_c.cpp @@ -126,7 +126,7 @@ class ASRToCVisitor : public BaseCCPPVisitor ASR::Derived_t *t = ASR::down_cast(v.m_type); std::string der_type_name = ASRUtils::symbol_name(t->m_derived_type); std::string dims = convert_dims_c(t->n_dims, t->m_dims); - if( v.m_intent == ASRUtils::intent_local && pre_initialise_derived_type ) { + if( v.m_intent == ASRUtils::intent_local && pre_initialise_derived_type) { std::string value_var_name = v.m_parent_symtab->get_unique_name(std::string(v.m_name) + "_value"); sub = format_type_c(dims, "struct " + der_type_name, value_var_name, use_ref, dummy); @@ -137,7 +137,11 @@ class ASRToCVisitor : public BaseCCPPVisitor } sub += ";\n"; sub += indent + format_type_c("", "struct " + der_type_name + "*", v.m_name, use_ref, dummy); - sub += "= &" + value_var_name; + if( t->n_dims != 0 ) { + sub += " = " + value_var_name; + } else { + sub += " = &" + value_var_name; + } return sub; } else { sub = format_type_c(dims, "struct " + der_type_name + "*", diff --git a/src/libasr/codegen/asr_to_c_cpp.h b/src/libasr/codegen/asr_to_c_cpp.h index badb41b0a2..2d63b8b14c 100644 --- a/src/libasr/codegen/asr_to_c_cpp.h +++ b/src/libasr/codegen/asr_to_c_cpp.h @@ -581,12 +581,20 @@ R"(#include this->visit_expr(*x.m_v); der_expr = std::move(src); member = ASRUtils::symbol_name(x.m_m); - src = der_expr + "->" + member; + if( ASR::is_a(*x.m_v) ) { + src = der_expr + "." + member; + } else { + src = der_expr + "->" + member; + } } void visit_ArrayRef(const ASR::ArrayRef_t &x) { const ASR::symbol_t *s = ASRUtils::symbol_get_past_external(x.m_v); ASR::Variable_t* sv = ASR::down_cast(s); + std::string prefix = ""; + // if( ASR::is_a(*sv->m_type) ) { + // prefix = "&"; + // } std::string out = std::string(sv->m_name); ASR::dimension_t* m_dims; ASRUtils::extract_dimensions_from_ttype(sv->m_type, m_dims); @@ -606,6 +614,11 @@ R"(#include } out += "]"; last_expr_precedence = 2; + // if( !prefix.empty() ) { + // src = prefix + "(" + out + ")"; + // } else { + // src = out; + // } src = out; } From 06b639054b5603cf52d6b588b60d787e1e50f007 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Fri, 1 Jul 2022 19:50:05 +0530 Subject: [PATCH 08/13] Ignore generated files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1c4601ec17..eaf2f841f9 100644 --- a/.gitignore +++ b/.gitignore @@ -188,6 +188,7 @@ integration_tests/structs_02 integration_tests/structs_02.c integration_tests/structs_03 integration_tests/structs_03.c +integration_tests/structs_05 integration_tests/structs_05.c integration_tests/expr_08 integration_tests/expr_08.c From 18bf8c3ea7f94f256715760fdfa088e30e4862fe Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Fri, 1 Jul 2022 19:52:27 +0530 Subject: [PATCH 09/13] Updated reference tests --- tests/reference/asr-structs_05-fa98307.json | 13 +++++++++++++ tests/reference/asr-structs_05-fa98307.stdout | 1 + tests/tests.toml | 4 ++++ 3 files changed, 18 insertions(+) create mode 100644 tests/reference/asr-structs_05-fa98307.json create mode 100644 tests/reference/asr-structs_05-fa98307.stdout diff --git a/tests/reference/asr-structs_05-fa98307.json b/tests/reference/asr-structs_05-fa98307.json new file mode 100644 index 0000000000..0293f9f66d --- /dev/null +++ b/tests/reference/asr-structs_05-fa98307.json @@ -0,0 +1,13 @@ +{ + "basename": "asr-structs_05-fa98307", + "cmd": "lpython --show-asr --no-color {infile} -o {outfile}", + "infile": "tests/../integration_tests/structs_05.py", + "infile_hash": "a7c4c632d30b3a4c4df207d08028d50a1f0b0061b7eeaacc467d2ee1", + "outfile": null, + "outfile_hash": null, + "stdout": "asr-structs_05-fa98307.stdout", + "stdout_hash": "e5df33c5f2d348442a427ad66bc21ef5b0a40d1c275b6633298cdfe1", + "stderr": null, + "stderr_hash": null, + "returncode": 0 +} \ No newline at end of file diff --git a/tests/reference/asr-structs_05-fa98307.stdout b/tests/reference/asr-structs_05-fa98307.stdout new file mode 100644 index 0000000000..d21797ee6e --- /dev/null +++ b/tests/reference/asr-structs_05-fa98307.stdout @@ -0,0 +1 @@ +(TranslationUnit (SymbolTable 1 {A: (DerivedType (SymbolTable 2 {x: (Variable 2 x Local () () Default (Integer 4 []) Source Public Required .false.), y: (Variable 2 y Local () () Default (Real 8 []) Source Public Required .false.)}) A [y x] Source Public ()), _lpython_main_program: (Subroutine (SymbolTable 81 {}) _lpython_main_program [] [(SubroutineCall 1 g () [] ())] Source Public Implementation () .false. .false.), abs@__lpython_overloaded_0__abs: (ExternalSymbol 1 abs@__lpython_overloaded_0__abs 5 __lpython_overloaded_0__abs lpython_builtin [] __lpython_overloaded_0__abs Public), g: (Subroutine (SymbolTable 3 {abs: (ExternalSymbol 3 abs 5 abs lpython_builtin [] abs Private), eps: (Variable 3 eps Local () () Default (Real 8 []) Source Public Required .false.), y: (Variable 3 y Local () () Default (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) Source Public Required .false.)}) g [] [(= (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) (DerivedTypeConstructor 1 A [(RealConstant 1.10000000000000009e+00 (Real 8 [])) (IntegerConstant 1 (Integer 4 []))] (Derived 1 A []) ()) ()) (= (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) (DerivedTypeConstructor 1 A [(RealConstant 2.20000000000000018e+00 (Real 8 [])) (IntegerConstant 2 (Integer 4 []))] (Derived 1 A []) ()) ()) (Print () [(DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) Eq (IntegerConstant 1 (Integer 4 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ()) Eq (RealConstant 1.10000000000000009e+00 (Real 8 [])) (Logical 4 []) ()) ()) (Print () [(DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) Eq (IntegerConstant 2 (Integer 4 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ()) Eq (RealConstant 2.20000000000000018e+00 (Real 8 [])) (Logical 4 []) ()) ()) (= (Var 3 eps) (RealConstant 9.99999999999999980e-13 (Real 8 [])) ()) (= (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) (IntegerConstant 2 (Integer 4 [])) ()) (= (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ()) (RealConstant 1.19999999999999996e+00 (Real 8 [])) ()) (= (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) (IntegerConstant 3 (Integer 4 [])) ()) (= (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ()) (RealConstant 2.29999999999999982e+00 (Real 8 [])) ()) (Print () [(DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) Eq (IntegerConstant 2 (Integer 4 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 1 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ()) Sub (RealConstant 1.19999999999999996e+00 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (Print () [(DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) Eq (IntegerConstant 3 (Integer 4 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 1 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ()) Sub (RealConstant 2.29999999999999982e+00 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ())] Source Public Implementation () .false. .false.), lpython_builtin: (IntrinsicModule lpython_builtin), main_program: (Program (SymbolTable 80 {}) main_program [] [(SubroutineCall 1 _lpython_main_program () [] ())])}) []) diff --git a/tests/tests.toml b/tests/tests.toml index 26970e4292..f95b0feaf0 100644 --- a/tests/tests.toml +++ b/tests/tests.toml @@ -244,6 +244,10 @@ asr = true filename = "../integration_tests/structs_04.py" asr = true +[[test]] +filename = "../integration_tests/structs_05.py" +asr = true + [[test]] filename = "../integration_tests/bindc_01.py" asr = true From a9b875d7a2d89fc7eeda75bc0b6d9fe41d440725 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Tue, 5 Jul 2022 14:32:20 +0530 Subject: [PATCH 10/13] Added test to pass arrays of structs --- integration_tests/structs_05.py | 38 ++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/integration_tests/structs_05.py b/integration_tests/structs_05.py index a52ec316e1..e5ec3d4dfe 100644 --- a/integration_tests/structs_05.py +++ b/integration_tests/structs_05.py @@ -5,28 +5,32 @@ class A: y: f64 x: i32 +def verify(s: A[:], x1: i32, y1: f64, x2: i32, y2: f64): + eps: f64 = 1e-12 + print(s[0].x, s[0].y) + assert s[0].x == x1 + assert abs(s[0].y - y1) < eps + print(s[1].x, s[1].y) + assert s[1].x == x2 + assert abs(s[1].y - y2) < eps + +def update_1(s: A): + s.x = 2 + s.y = 1.2 + +def update_2(s: A[:]): + s[1].x = 3 + s[1].y = 2.3 + def g(): # TODO: Replace y: A[2] with y: A[2] = [None, None] # TODO: And enable cpython in integration_tests. y: A[2] y[0] = A(1.1, 1) y[1] = A(2.2, 2) - print(y[0].x, y[0].y) - assert y[0].x == 1 - assert y[0].y == 1.1 - print(y[1].x, y[1].y) - assert y[1].x == 2 - assert y[1].y == 2.2 - eps: f64 = 1e-12 - y[0].x = 2 - y[0].y = 1.2 - y[1].x = 3 - y[1].y = 2.3 - print(y[0].x, y[0].y) - assert y[0].x == 2 - assert abs(y[0].y - 1.2) < eps - print(y[1].x, y[1].y) - assert y[1].x == 3 - assert abs(y[1].y - 2.3) < eps + verify(y, 1, 1.1, 2, 2.2) + update_1(y[0]) + update_2(y) + verify(y, 2, 1.2, 3, 2.3) g() From bf0b5f55a23539b3533b1791c19aa7a23e6c7a31 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Tue, 5 Jul 2022 14:32:54 +0530 Subject: [PATCH 11/13] Update C backend to allow passing struct arrays and its indexed elements to functions --- src/libasr/codegen/asr_to_c.cpp | 5 +++++ src/libasr/codegen/asr_to_c_cpp.h | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/libasr/codegen/asr_to_c.cpp b/src/libasr/codegen/asr_to_c.cpp index eb352f6b33..3407d23f42 100644 --- a/src/libasr/codegen/asr_to_c.cpp +++ b/src/libasr/codegen/asr_to_c.cpp @@ -174,6 +174,11 @@ class ASRToCVisitor : public BaseCCPPVisitor } return sub; } else { + if( v.m_intent == ASRUtils::intent_in || + v.m_intent == ASRUtils::intent_inout ) { + use_ref = false; + dims = ""; + } sub = format_type_c(dims, "struct " + der_type_name + "*", v.m_name, use_ref, dummy); } diff --git a/src/libasr/codegen/asr_to_c_cpp.h b/src/libasr/codegen/asr_to_c_cpp.h index ed3816345c..a344532868 100644 --- a/src/libasr/codegen/asr_to_c_cpp.h +++ b/src/libasr/codegen/asr_to_c_cpp.h @@ -1172,7 +1172,12 @@ R"(#include out += arg_name; } else { self().visit_expr(*x.m_args[i].m_value); - out += src; + if( ASR::is_a(*x.m_args[i].m_value) && + ASR::is_a(*ASRUtils::expr_type(x.m_args[i].m_value)) ) { + out += "&" + src; + } else { + out += src; + } } if (i < x.n_args-1) out += ", "; } From 11db8b50a9e393eeb5c9a4fc0c75e6b837eab00b Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Tue, 5 Jul 2022 14:33:05 +0530 Subject: [PATCH 12/13] Update reference tests --- tests/reference/asr-structs_05-fa98307.json | 4 ++-- tests/reference/asr-structs_05-fa98307.stdout | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/reference/asr-structs_05-fa98307.json b/tests/reference/asr-structs_05-fa98307.json index 0293f9f66d..0df23648a6 100644 --- a/tests/reference/asr-structs_05-fa98307.json +++ b/tests/reference/asr-structs_05-fa98307.json @@ -2,11 +2,11 @@ "basename": "asr-structs_05-fa98307", "cmd": "lpython --show-asr --no-color {infile} -o {outfile}", "infile": "tests/../integration_tests/structs_05.py", - "infile_hash": "a7c4c632d30b3a4c4df207d08028d50a1f0b0061b7eeaacc467d2ee1", + "infile_hash": "8022943f9e2faac2fac4bd147f9ccba284127429215ddef38d22beb8", "outfile": null, "outfile_hash": null, "stdout": "asr-structs_05-fa98307.stdout", - "stdout_hash": "e5df33c5f2d348442a427ad66bc21ef5b0a40d1c275b6633298cdfe1", + "stdout_hash": "0f39bcd83db0987204aee15a66af6f5122e3d25d25b6d611557b3c02", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/asr-structs_05-fa98307.stdout b/tests/reference/asr-structs_05-fa98307.stdout index d21797ee6e..e3aac2aac6 100644 --- a/tests/reference/asr-structs_05-fa98307.stdout +++ b/tests/reference/asr-structs_05-fa98307.stdout @@ -1 +1 @@ -(TranslationUnit (SymbolTable 1 {A: (DerivedType (SymbolTable 2 {x: (Variable 2 x Local () () Default (Integer 4 []) Source Public Required .false.), y: (Variable 2 y Local () () Default (Real 8 []) Source Public Required .false.)}) A [y x] Source Public ()), _lpython_main_program: (Subroutine (SymbolTable 81 {}) _lpython_main_program [] [(SubroutineCall 1 g () [] ())] Source Public Implementation () .false. .false.), abs@__lpython_overloaded_0__abs: (ExternalSymbol 1 abs@__lpython_overloaded_0__abs 5 __lpython_overloaded_0__abs lpython_builtin [] __lpython_overloaded_0__abs Public), g: (Subroutine (SymbolTable 3 {abs: (ExternalSymbol 3 abs 5 abs lpython_builtin [] abs Private), eps: (Variable 3 eps Local () () Default (Real 8 []) Source Public Required .false.), y: (Variable 3 y Local () () Default (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) Source Public Required .false.)}) g [] [(= (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) (DerivedTypeConstructor 1 A [(RealConstant 1.10000000000000009e+00 (Real 8 [])) (IntegerConstant 1 (Integer 4 []))] (Derived 1 A []) ()) ()) (= (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) (DerivedTypeConstructor 1 A [(RealConstant 2.20000000000000018e+00 (Real 8 [])) (IntegerConstant 2 (Integer 4 []))] (Derived 1 A []) ()) ()) (Print () [(DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) Eq (IntegerConstant 1 (Integer 4 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ()) Eq (RealConstant 1.10000000000000009e+00 (Real 8 [])) (Logical 4 []) ()) ()) (Print () [(DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) Eq (IntegerConstant 2 (Integer 4 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ()) Eq (RealConstant 2.20000000000000018e+00 (Real 8 [])) (Logical 4 []) ()) ()) (= (Var 3 eps) (RealConstant 9.99999999999999980e-13 (Real 8 [])) ()) (= (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) (IntegerConstant 2 (Integer 4 [])) ()) (= (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ()) (RealConstant 1.19999999999999996e+00 (Real 8 [])) ()) (= (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) (IntegerConstant 3 (Integer 4 [])) ()) (= (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ()) (RealConstant 2.29999999999999982e+00 (Real 8 [])) ()) (Print () [(DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) Eq (IntegerConstant 2 (Integer 4 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 1 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ()) Sub (RealConstant 1.19999999999999996e+00 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (Print () [(DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 x (Integer 4 []) ()) Eq (IntegerConstant 3 (Integer 4 [])) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 1 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (DerivedRef (ArrayRef 3 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) 2 y (Real 8 []) ()) Sub (RealConstant 2.29999999999999982e+00 (Real 8 [])) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ())] Source Public Implementation () .false. .false.), lpython_builtin: (IntrinsicModule lpython_builtin), main_program: (Program (SymbolTable 80 {}) main_program [] [(SubroutineCall 1 _lpython_main_program () [] ())])}) []) +(TranslationUnit (SymbolTable 1 {A: (DerivedType (SymbolTable 2 {x: (Variable 2 x Local () () Default (Integer 4 []) Source Public Required .false.), y: (Variable 2 y Local () () Default (Real 8 []) Source Public Required .false.)}) A [y x] Source Public ()), _lpython_main_program: (Subroutine (SymbolTable 84 {}) _lpython_main_program [] [(SubroutineCall 1 g () [] ())] Source Public Implementation () .false. .false.), abs@__lpython_overloaded_0__abs: (ExternalSymbol 1 abs@__lpython_overloaded_0__abs 8 __lpython_overloaded_0__abs lpython_builtin [] __lpython_overloaded_0__abs Public), g: (Subroutine (SymbolTable 6 {y: (Variable 6 y Local () () Default (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) Source Public Required .false.)}) g [] [(= (ArrayRef 6 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) (DerivedTypeConstructor 1 A [(RealConstant 1.10000000000000009e+00 (Real 8 [])) (IntegerConstant 1 (Integer 4 []))] (Derived 1 A []) ()) ()) (= (ArrayRef 6 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) (DerivedTypeConstructor 1 A [(RealConstant 2.20000000000000018e+00 (Real 8 [])) (IntegerConstant 2 (Integer 4 []))] (Derived 1 A []) ()) ()) (SubroutineCall 1 verify () [((Var 6 y)) ((IntegerConstant 1 (Integer 4 []))) ((RealConstant 1.10000000000000009e+00 (Real 8 []))) ((IntegerConstant 2 (Integer 4 []))) ((RealConstant 2.20000000000000018e+00 (Real 8 [])))] ()) (SubroutineCall 1 update_1 () [((ArrayRef 6 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()))] ()) (SubroutineCall 1 update_2 () [((Var 6 y))] ()) (SubroutineCall 1 verify () [((Var 6 y)) ((IntegerConstant 2 (Integer 4 []))) ((RealConstant 1.19999999999999996e+00 (Real 8 []))) ((IntegerConstant 3 (Integer 4 []))) ((RealConstant 2.29999999999999982e+00 (Real 8 [])))] ())] Source Public Implementation () .false. .false.), lpython_builtin: (IntrinsicModule lpython_builtin), main_program: (Program (SymbolTable 83 {}) main_program [] [(SubroutineCall 1 _lpython_main_program () [] ())]), update_1: (Subroutine (SymbolTable 4 {s: (Variable 4 s In () () Default (Derived 1 A []) Source Public Required .false.)}) update_1 [(Var 4 s)] [(= (DerivedRef (Var 4 s) 2 x (Integer 4 []) ()) (IntegerConstant 2 (Integer 4 [])) ()) (= (DerivedRef (Var 4 s) 2 y (Real 8 []) ()) (RealConstant 1.19999999999999996e+00 (Real 8 [])) ())] Source Public Implementation () .false. .false.), update_2: (Subroutine (SymbolTable 5 {s: (Variable 5 s InOut () () Default (Derived 1 A [(() ())]) Source Public Required .false.)}) update_2 [(Var 5 s)] [(= (DerivedRef (ArrayRef 5 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) (IntegerConstant 3 (Integer 4 [])) ()) (= (DerivedRef (ArrayRef 5 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ()) (RealConstant 2.29999999999999982e+00 (Real 8 [])) ())] Source Public Implementation () .false. .false.), verify: (Subroutine (SymbolTable 3 {abs: (ExternalSymbol 3 abs 8 abs lpython_builtin [] abs Private), eps: (Variable 3 eps Local () () Default (Real 8 []) Source Public Required .false.), s: (Variable 3 s InOut () () Default (Derived 1 A [(() ())]) Source Public Required .false.), x1: (Variable 3 x1 In () () Default (Integer 4 []) Source Public Required .false.), x2: (Variable 3 x2 In () () Default (Integer 4 []) Source Public Required .false.), y1: (Variable 3 y1 In () () Default (Real 8 []) Source Public Required .false.), y2: (Variable 3 y2 In () () Default (Real 8 []) Source Public Required .false.)}) verify [(Var 3 s) (Var 3 x1) (Var 3 y1) (Var 3 x2) (Var 3 y2)] [(= (Var 3 eps) (RealConstant 9.99999999999999980e-13 (Real 8 [])) ()) (Print () [(DerivedRef (ArrayRef 3 s [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayRef 3 s [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayRef 3 s [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) Eq (Var 3 x1) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 1 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (DerivedRef (ArrayRef 3 s [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ()) Sub (Var 3 y1) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (Print () [(DerivedRef (ArrayRef 3 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayRef 3 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayRef 3 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) Eq (Var 3 x2) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 1 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (DerivedRef (ArrayRef 3 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ()) Sub (Var 3 y2) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ())] Source Public Implementation () .false. .false.)}) []) From 90c6e8ede9e4a614a9390fd89179b2946f20bfc0 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Thu, 7 Jul 2022 12:13:31 +0530 Subject: [PATCH 13/13] ArrayRef -> ArrayItem --- src/libasr/codegen/asr_to_c_cpp.h | 4 ++-- tests/reference/asr-structs_05-fa98307.json | 2 +- tests/reference/asr-structs_05-fa98307.stdout | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libasr/codegen/asr_to_c_cpp.h b/src/libasr/codegen/asr_to_c_cpp.h index 06a5335e0c..6df0e16554 100644 --- a/src/libasr/codegen/asr_to_c_cpp.h +++ b/src/libasr/codegen/asr_to_c_cpp.h @@ -583,7 +583,7 @@ R"(#include this->visit_expr(*x.m_v); der_expr = std::move(src); member = ASRUtils::symbol_name(x.m_m); - if( ASR::is_a(*x.m_v) ) { + if( ASR::is_a(*x.m_v) ) { src = der_expr + "." + member; } else { src = der_expr + "->" + member; @@ -1172,7 +1172,7 @@ R"(#include out += arg_name; } else { self().visit_expr(*x.m_args[i].m_value); - if( ASR::is_a(*x.m_args[i].m_value) && + if( ASR::is_a(*x.m_args[i].m_value) && ASR::is_a(*ASRUtils::expr_type(x.m_args[i].m_value)) ) { out += "&" + src; } else { diff --git a/tests/reference/asr-structs_05-fa98307.json b/tests/reference/asr-structs_05-fa98307.json index 0df23648a6..15588e5d2d 100644 --- a/tests/reference/asr-structs_05-fa98307.json +++ b/tests/reference/asr-structs_05-fa98307.json @@ -6,7 +6,7 @@ "outfile": null, "outfile_hash": null, "stdout": "asr-structs_05-fa98307.stdout", - "stdout_hash": "0f39bcd83db0987204aee15a66af6f5122e3d25d25b6d611557b3c02", + "stdout_hash": "5611b3927900d1071ff9b00de1306cc5baeba9fefd0947d49552336e", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/asr-structs_05-fa98307.stdout b/tests/reference/asr-structs_05-fa98307.stdout index e3aac2aac6..39a1f094be 100644 --- a/tests/reference/asr-structs_05-fa98307.stdout +++ b/tests/reference/asr-structs_05-fa98307.stdout @@ -1 +1 @@ -(TranslationUnit (SymbolTable 1 {A: (DerivedType (SymbolTable 2 {x: (Variable 2 x Local () () Default (Integer 4 []) Source Public Required .false.), y: (Variable 2 y Local () () Default (Real 8 []) Source Public Required .false.)}) A [y x] Source Public ()), _lpython_main_program: (Subroutine (SymbolTable 84 {}) _lpython_main_program [] [(SubroutineCall 1 g () [] ())] Source Public Implementation () .false. .false.), abs@__lpython_overloaded_0__abs: (ExternalSymbol 1 abs@__lpython_overloaded_0__abs 8 __lpython_overloaded_0__abs lpython_builtin [] __lpython_overloaded_0__abs Public), g: (Subroutine (SymbolTable 6 {y: (Variable 6 y Local () () Default (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) Source Public Required .false.)}) g [] [(= (ArrayRef 6 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) (DerivedTypeConstructor 1 A [(RealConstant 1.10000000000000009e+00 (Real 8 [])) (IntegerConstant 1 (Integer 4 []))] (Derived 1 A []) ()) ()) (= (ArrayRef 6 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) (DerivedTypeConstructor 1 A [(RealConstant 2.20000000000000018e+00 (Real 8 [])) (IntegerConstant 2 (Integer 4 []))] (Derived 1 A []) ()) ()) (SubroutineCall 1 verify () [((Var 6 y)) ((IntegerConstant 1 (Integer 4 []))) ((RealConstant 1.10000000000000009e+00 (Real 8 []))) ((IntegerConstant 2 (Integer 4 []))) ((RealConstant 2.20000000000000018e+00 (Real 8 [])))] ()) (SubroutineCall 1 update_1 () [((ArrayRef 6 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()))] ()) (SubroutineCall 1 update_2 () [((Var 6 y))] ()) (SubroutineCall 1 verify () [((Var 6 y)) ((IntegerConstant 2 (Integer 4 []))) ((RealConstant 1.19999999999999996e+00 (Real 8 []))) ((IntegerConstant 3 (Integer 4 []))) ((RealConstant 2.29999999999999982e+00 (Real 8 [])))] ())] Source Public Implementation () .false. .false.), lpython_builtin: (IntrinsicModule lpython_builtin), main_program: (Program (SymbolTable 83 {}) main_program [] [(SubroutineCall 1 _lpython_main_program () [] ())]), update_1: (Subroutine (SymbolTable 4 {s: (Variable 4 s In () () Default (Derived 1 A []) Source Public Required .false.)}) update_1 [(Var 4 s)] [(= (DerivedRef (Var 4 s) 2 x (Integer 4 []) ()) (IntegerConstant 2 (Integer 4 [])) ()) (= (DerivedRef (Var 4 s) 2 y (Real 8 []) ()) (RealConstant 1.19999999999999996e+00 (Real 8 [])) ())] Source Public Implementation () .false. .false.), update_2: (Subroutine (SymbolTable 5 {s: (Variable 5 s InOut () () Default (Derived 1 A [(() ())]) Source Public Required .false.)}) update_2 [(Var 5 s)] [(= (DerivedRef (ArrayRef 5 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) (IntegerConstant 3 (Integer 4 [])) ()) (= (DerivedRef (ArrayRef 5 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ()) (RealConstant 2.29999999999999982e+00 (Real 8 [])) ())] Source Public Implementation () .false. .false.), verify: (Subroutine (SymbolTable 3 {abs: (ExternalSymbol 3 abs 8 abs lpython_builtin [] abs Private), eps: (Variable 3 eps Local () () Default (Real 8 []) Source Public Required .false.), s: (Variable 3 s InOut () () Default (Derived 1 A [(() ())]) Source Public Required .false.), x1: (Variable 3 x1 In () () Default (Integer 4 []) Source Public Required .false.), x2: (Variable 3 x2 In () () Default (Integer 4 []) Source Public Required .false.), y1: (Variable 3 y1 In () () Default (Real 8 []) Source Public Required .false.), y2: (Variable 3 y2 In () () Default (Real 8 []) Source Public Required .false.)}) verify [(Var 3 s) (Var 3 x1) (Var 3 y1) (Var 3 x2) (Var 3 y2)] [(= (Var 3 eps) (RealConstant 9.99999999999999980e-13 (Real 8 [])) ()) (Print () [(DerivedRef (ArrayRef 3 s [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayRef 3 s [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayRef 3 s [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) Eq (Var 3 x1) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 1 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (DerivedRef (ArrayRef 3 s [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ()) Sub (Var 3 y1) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (Print () [(DerivedRef (ArrayRef 3 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayRef 3 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayRef 3 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) Eq (Var 3 x2) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 1 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (DerivedRef (ArrayRef 3 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ()) Sub (Var 3 y2) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ())] Source Public Implementation () .false. .false.)}) []) +(TranslationUnit (SymbolTable 1 {A: (DerivedType (SymbolTable 2 {x: (Variable 2 x Local () () Default (Integer 4 []) Source Public Required .false.), y: (Variable 2 y Local () () Default (Real 8 []) Source Public Required .false.)}) A [y x] Source Public ()), _lpython_main_program: (Subroutine (SymbolTable 84 {}) _lpython_main_program [] [(SubroutineCall 1 g () [] ())] Source Public Implementation () .false. .false.), abs@__lpython_overloaded_0__abs: (ExternalSymbol 1 abs@__lpython_overloaded_0__abs 8 __lpython_overloaded_0__abs lpython_builtin [] __lpython_overloaded_0__abs Public), g: (Subroutine (SymbolTable 6 {y: (Variable 6 y Local () () Default (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) Source Public Required .false.)}) g [] [(= (ArrayItem 6 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) (DerivedTypeConstructor 1 A [(RealConstant 1.10000000000000009e+00 (Real 8 [])) (IntegerConstant 1 (Integer 4 []))] (Derived 1 A []) ()) ()) (= (ArrayItem 6 y [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()) (DerivedTypeConstructor 1 A [(RealConstant 2.20000000000000018e+00 (Real 8 [])) (IntegerConstant 2 (Integer 4 []))] (Derived 1 A []) ()) ()) (SubroutineCall 1 verify () [((Var 6 y)) ((IntegerConstant 1 (Integer 4 []))) ((RealConstant 1.10000000000000009e+00 (Real 8 []))) ((IntegerConstant 2 (Integer 4 []))) ((RealConstant 2.20000000000000018e+00 (Real 8 [])))] ()) (SubroutineCall 1 update_1 () [((ArrayItem 6 y [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [((IntegerConstant 0 (Integer 4 [])) (IntegerBinOp (IntegerConstant 2 (Integer 4 [])) Sub (IntegerConstant 1 (Integer 4 [])) (Integer 4 []) (IntegerConstant 1 (Integer 4 []))))]) ()))] ()) (SubroutineCall 1 update_2 () [((Var 6 y))] ()) (SubroutineCall 1 verify () [((Var 6 y)) ((IntegerConstant 2 (Integer 4 []))) ((RealConstant 1.19999999999999996e+00 (Real 8 []))) ((IntegerConstant 3 (Integer 4 []))) ((RealConstant 2.29999999999999982e+00 (Real 8 [])))] ())] Source Public Implementation () .false. .false.), lpython_builtin: (IntrinsicModule lpython_builtin), main_program: (Program (SymbolTable 83 {}) main_program [] [(SubroutineCall 1 _lpython_main_program () [] ())]), update_1: (Subroutine (SymbolTable 4 {s: (Variable 4 s In () () Default (Derived 1 A []) Source Public Required .false.)}) update_1 [(Var 4 s)] [(= (DerivedRef (Var 4 s) 2 x (Integer 4 []) ()) (IntegerConstant 2 (Integer 4 [])) ()) (= (DerivedRef (Var 4 s) 2 y (Real 8 []) ()) (RealConstant 1.19999999999999996e+00 (Real 8 [])) ())] Source Public Implementation () .false. .false.), update_2: (Subroutine (SymbolTable 5 {s: (Variable 5 s InOut () () Default (Derived 1 A [(() ())]) Source Public Required .false.)}) update_2 [(Var 5 s)] [(= (DerivedRef (ArrayItem 5 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) (IntegerConstant 3 (Integer 4 [])) ()) (= (DerivedRef (ArrayItem 5 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ()) (RealConstant 2.29999999999999982e+00 (Real 8 [])) ())] Source Public Implementation () .false. .false.), verify: (Subroutine (SymbolTable 3 {abs: (ExternalSymbol 3 abs 8 abs lpython_builtin [] abs Private), eps: (Variable 3 eps Local () () Default (Real 8 []) Source Public Required .false.), s: (Variable 3 s InOut () () Default (Derived 1 A [(() ())]) Source Public Required .false.), x1: (Variable 3 x1 In () () Default (Integer 4 []) Source Public Required .false.), x2: (Variable 3 x2 In () () Default (Integer 4 []) Source Public Required .false.), y1: (Variable 3 y1 In () () Default (Real 8 []) Source Public Required .false.), y2: (Variable 3 y2 In () () Default (Real 8 []) Source Public Required .false.)}) verify [(Var 3 s) (Var 3 x1) (Var 3 y1) (Var 3 x2) (Var 3 y2)] [(= (Var 3 eps) (RealConstant 9.99999999999999980e-13 (Real 8 [])) ()) (Print () [(DerivedRef (ArrayItem 3 s [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayItem 3 s [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayItem 3 s [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) Eq (Var 3 x1) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 1 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (DerivedRef (ArrayItem 3 s [(() (IntegerConstant 0 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ()) Sub (Var 3 y1) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ()) (Print () [(DerivedRef (ArrayItem 3 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) (DerivedRef (ArrayItem 3 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ())] () ()) (Assert (IntegerCompare (DerivedRef (ArrayItem 3 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 x (Integer 4 []) ()) Eq (Var 3 x2) (Logical 4 []) ()) ()) (Assert (RealCompare (FunctionCall 1 abs@__lpython_overloaded_0__abs 3 abs [((RealBinOp (DerivedRef (ArrayItem 3 s [(() (IntegerConstant 1 (Integer 4 [])) ())] (Derived 1 A [(() ())]) ()) 2 y (Real 8 []) ()) Sub (Var 3 y2) (Real 8 []) ()))] (Real 8 []) () ()) Lt (Var 3 eps) (Logical 4 []) ()) ())] Source Public Implementation () .false. .false.)}) [])