From 14151a385226a8019d91059baf0523a91dc8d8f6 Mon Sep 17 00:00:00 2001 From: Shaikh Ubaid Date: Mon, 31 Jul 2023 07:50:41 +0530 Subject: [PATCH 1/4] ASR: Fix type for ListItem in explicit_loop_var --- src/lpython/semantics/python_ast_to_asr.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/lpython/semantics/python_ast_to_asr.cpp b/src/lpython/semantics/python_ast_to_asr.cpp index 987900e57d..30a476bd3d 100644 --- a/src/lpython/semantics/python_ast_to_asr.cpp +++ b/src/lpython/semantics/python_ast_to_asr.cpp @@ -5522,16 +5522,17 @@ class BodyVisitor : public CommonVisitor { auto explicit_iter_var = ASR::make_Var_t(al, x.base.base.loc, current_scope->get_symbol(explicit_iter_name)); auto index_plus_one = ASR::make_IntegerBinOp_t(al, x.base.base.loc, ASRUtils::EXPR(explicit_iter_var), ASR::binopType::Add, constant_one, a_type, nullptr); - auto loop_src_var = ASR::make_Var_t(al, x.base.base.loc, current_scope->resolve_symbol(loop_src_var_name)); + ASR::expr_t* loop_src_var = ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, current_scope->resolve_symbol(loop_src_var_name))); + ASR::ttype_t* loop_src_var_ttype = ASRUtils::expr_type(loop_src_var); ASR::asr_t* loop_src_var_element = nullptr; if (ASR::is_a(*for_iter_type)) { loop_src_var_element = ASR::make_StringItem_t( - al, x.base.base.loc, ASRUtils::EXPR(loop_src_var), - ASRUtils::EXPR(index_plus_one), a_type, nullptr); + al, x.base.base.loc, loop_src_var, + ASRUtils::EXPR(index_plus_one), ASRUtils::get_contained_type(loop_src_var_ttype), nullptr); } else if (ASR::is_a(*for_iter_type)) { loop_src_var_element = ASR::make_ListItem_t( - al, x.base.base.loc, ASRUtils::EXPR(loop_src_var), - ASRUtils::EXPR(explicit_iter_var), a_type, nullptr); + al, x.base.base.loc, loop_src_var, + ASRUtils::EXPR(explicit_iter_var), ASRUtils::get_contained_type(loop_src_var_ttype), nullptr); } auto loop_target_assignment = ASR::make_Assignment_t(al, x.base.base.loc, target, ASRUtils::EXPR(loop_src_var_element), nullptr); body.push_back(al, ASRUtils::STMT(loop_target_assignment)); From cbcd1cd576d1d31c5467ba800ee18eb2aa71b225 Mon Sep 17 00:00:00 2001 From: Shaikh Ubaid Date: Mon, 31 Jul 2023 07:52:51 +0530 Subject: [PATCH 2/4] Refactor: ASR: Place insts inside if This way they would be executed only if needed --- src/lpython/semantics/python_ast_to_asr.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lpython/semantics/python_ast_to_asr.cpp b/src/lpython/semantics/python_ast_to_asr.cpp index 30a476bd3d..ce3cf6ca8d 100644 --- a/src/lpython/semantics/python_ast_to_asr.cpp +++ b/src/lpython/semantics/python_ast_to_asr.cpp @@ -5503,9 +5503,6 @@ class BodyVisitor : public CommonVisitor { if (!is_explicit_iterator_required) { a_kind = ASRUtils::extract_kind_from_ttype_t(ASRUtils::expr_type(target)); } - ASR::ttype_t *a_type = ASRUtils::TYPE(ASR::make_Integer_t(al, x.base.base.loc, a_kind)); - ASR::expr_t *constant_one = ASR::down_cast(ASR::make_IntegerConstant_t( - al, x.base.base.loc, 1, a_type)); ASR::do_loop_head_t head = make_do_loop_head(loop_start, loop_end, inc, a_kind, x.base.base.loc); @@ -5520,6 +5517,9 @@ class BodyVisitor : public CommonVisitor { // add an assignment instruction to body to assign value of loop_src_var at an index to the loop_target_var LCOMPILERS_ASSERT(current_scope->get_symbol(explicit_iter_name) != nullptr); auto explicit_iter_var = ASR::make_Var_t(al, x.base.base.loc, current_scope->get_symbol(explicit_iter_name)); + ASR::ttype_t *a_type = ASRUtils::TYPE(ASR::make_Integer_t(al, x.base.base.loc, a_kind)); + ASR::expr_t *constant_one = ASR::down_cast(ASR::make_IntegerConstant_t( + al, x.base.base.loc, 1, a_type)); auto index_plus_one = ASR::make_IntegerBinOp_t(al, x.base.base.loc, ASRUtils::EXPR(explicit_iter_var), ASR::binopType::Add, constant_one, a_type, nullptr); ASR::expr_t* loop_src_var = ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, current_scope->resolve_symbol(loop_src_var_name))); From ff632e19f7f66029b47c98b69aab08b66486e474 Mon Sep 17 00:00:00 2001 From: Shaikh Ubaid Date: Mon, 31 Jul 2023 08:03:06 +0530 Subject: [PATCH 3/4] TEST: Add and enable for explicit_loop_var Also enable integration_tests/test_pkg_lpconvexhull.py for LLVM --- integration_tests/CMakeLists.txt | 3 ++- integration_tests/loop_07.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 integration_tests/loop_07.py diff --git a/integration_tests/CMakeLists.txt b/integration_tests/CMakeLists.txt index aac3e60aed..64635ae094 100644 --- a/integration_tests/CMakeLists.txt +++ b/integration_tests/CMakeLists.txt @@ -484,6 +484,7 @@ RUN(NAME loop_03 LABELS cpython llvm c wasm wasm_x64) RUN(NAME loop_04 LABELS cpython llvm c) RUN(NAME loop_05 LABELS cpython llvm c) RUN(NAME loop_06 LABELS cpython llvm c NOFAST) +RUN(NAME loop_07 LABELS cpython llvm c) RUN(NAME if_01 LABELS cpython llvm c wasm wasm_x86 wasm_x64) RUN(NAME if_02 LABELS cpython llvm c wasm wasm_x86 wasm_x64) RUN(NAME if_03 FAIL LABELS cpython llvm c NOFAST) @@ -717,7 +718,7 @@ RUN(NAME test_package_01 LABELS cpython llvm NOFAST) RUN(NAME test_pkg_lpdraw LABELS cpython llvm wasm) RUN(NAME test_pkg_lnn_01 LABELS cpython llvm NOFAST) RUN(NAME test_pkg_lnn_02 LABELS cpython llvm NOFAST) -RUN(NAME test_pkg_lpconvexhull LABELS cpython c) +RUN(NAME test_pkg_lpconvexhull LABELS cpython llvm c NOFAST) RUN(NAME generics_01 LABELS cpython llvm c) RUN(NAME generics_02 LABELS cpython llvm c) diff --git a/integration_tests/loop_07.py b/integration_tests/loop_07.py new file mode 100644 index 0000000000..c0b045d5bb --- /dev/null +++ b/integration_tests/loop_07.py @@ -0,0 +1,17 @@ +from lpython import i32 + +def main0(): + points: list[tuple[i32, i32]] = [(445, 193), (138, 28), (418, 279)] + point: tuple[i32, i32] + x_sum: i32 = 0 + y_sum: i32 = 0 + for point in points: + print(point) + x_sum += point[0] + y_sum += point[1] + + print(x_sum, y_sum) + assert x_sum == 1001 + assert y_sum == 500 + +main0() From 3a25540d0fa267aac15482918f5fde07b4f132c2 Mon Sep 17 00:00:00 2001 From: Shaikh Ubaid Date: Mon, 31 Jul 2023 08:05:38 +0530 Subject: [PATCH 4/4] TEST: Update reference tests --- tests/reference/asr-test_builtin_str-580e920.json | 2 +- tests/reference/asr-test_builtin_str-580e920.stdout | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/reference/asr-test_builtin_str-580e920.json b/tests/reference/asr-test_builtin_str-580e920.json index c26bf1f7ee..c9015cbaf8 100644 --- a/tests/reference/asr-test_builtin_str-580e920.json +++ b/tests/reference/asr-test_builtin_str-580e920.json @@ -6,7 +6,7 @@ "outfile": null, "outfile_hash": null, "stdout": "asr-test_builtin_str-580e920.stdout", - "stdout_hash": "5e1687a9cce6c997ff5c0ff9c15dc4435f1abbd581fb77d647d9afe4", + "stdout_hash": "5869436dc7dad9581fe5088ceb646bb304ddc9f8ef790e6550687c9b", "stderr": null, "stderr_hash": null, "returncode": 0 diff --git a/tests/reference/asr-test_builtin_str-580e920.stdout b/tests/reference/asr-test_builtin_str-580e920.stdout index 2bb65223c4..039d4fc5f8 100644 --- a/tests/reference/asr-test_builtin_str-580e920.stdout +++ b/tests/reference/asr-test_builtin_str-580e920.stdout @@ -586,7 +586,7 @@ (Integer 4) () ) - (Integer 4) + (Character 1 -2 ()) () ) ()