From d43523fd682c48a036db49bec61d8f52267eeb33 Mon Sep 17 00:00:00 2001 From: advik Date: Wed, 27 Mar 2024 12:51:51 +0530 Subject: [PATCH 1/5] Add nested loop tests for else clause in loops --- integration_tests/loop_10.py | 44 ++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/integration_tests/loop_10.py b/integration_tests/loop_10.py index 00c91d58ed..e8df743855 100644 --- a/integration_tests/loop_10.py +++ b/integration_tests/loop_10.py @@ -49,9 +49,53 @@ def nested_loop_for_for(): return assert False +def nested_loop_for_while(): + i: i32 + j: i32 = 10 + for i in range(2): + print("outer: " + str(i)) + while j < 20: + print(" inner: " + str(j)) + break + else: + print("no break in outer loop") + return + assert False + +def nested_loop_while_for(): + i: i32 = 0 + j: i32 + while i < 2: + print("outer: " + str(i)) + i += 1 + for j in range(10, 20): + print(" inner: " + str(j)) + break + else: + print("no break in outer loop") + return + assert False + +def nested_loop_while_while(): + i: i32 = 0 + j: i32 = 10 + while i < 2: + print("outer: " + str(i)) + i += 1 + while j < 20: + print(" inner: " + str(j)) + break + else: + print("no break in outer loop") + return + assert False + with_break_for() with_break_while() no_break_for() break_in_if_for() nested_loop_for_for() +nested_loop_for_while() +nested_loop_while_for() +nested_loop_while_while() From acb1182ce09a98f5bfb841a1fefece2eb517e570 Mon Sep 17 00:00:00 2001 From: advik Date: Thu, 28 Mar 2024 20:41:41 +0530 Subject: [PATCH 2/5] Add nested else test --- integration_tests/loop_10.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/integration_tests/loop_10.py b/integration_tests/loop_10.py index e8df743855..224c0e21d9 100644 --- a/integration_tests/loop_10.py +++ b/integration_tests/loop_10.py @@ -90,6 +90,20 @@ def nested_loop_while_while(): return assert False +def nested_loop_else(): + i: i32 + j: i32 + for i in range(2): + print("outer: " + str(i)) + for j in range(10, 12): + print(" inner: " + str(j)) + else: + print("no break in inner loop") + else: + print("no break in outer loop") + return + assert False + with_break_for() with_break_while() @@ -99,3 +113,4 @@ def nested_loop_while_while(): nested_loop_for_while() nested_loop_while_for() nested_loop_while_while() +nested_loop_else() From 927fb438c48b276a83a4c4820f4db0642d372c32 Mon Sep 17 00:00:00 2001 From: advik Date: Sat, 30 Mar 2024 00:35:18 +0530 Subject: [PATCH 3/5] Fix bug in for else implementation --- src/libasr/pass/while_else.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libasr/pass/while_else.cpp b/src/libasr/pass/while_else.cpp index df44951087..07b2744a85 100644 --- a/src/libasr/pass/while_else.cpp +++ b/src/libasr/pass/while_else.cpp @@ -73,6 +73,8 @@ class WhileLoopVisitor : public ASR::StatementWalkVisitor Creating a flag variable in case of a while-else loop Creates an if statement after the loop to check if the flag was changed */ + ASR::WhileLoop_t &xx = const_cast(x); + transform_stmts(xx.m_body, xx.n_body); if (x.n_orelse > 0) { Vec result; result.reserve(al, 3); From a29ea9bbd314c626f95b71fd04a49891bcb1a5c8 Mon Sep 17 00:00:00 2001 From: advik Date: Sat, 30 Mar 2024 00:46:35 +0530 Subject: [PATCH 4/5] Update tests to use assert --- integration_tests/loop_10.py | 42 ++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/integration_tests/loop_10.py b/integration_tests/loop_10.py index 224c0e21d9..113704f7e9 100644 --- a/integration_tests/loop_10.py +++ b/integration_tests/loop_10.py @@ -1,7 +1,7 @@ def with_break_for(): - i: i32 + i: i32 = 0 for i in range(4): - print(i) + i += 1 break else: assert False @@ -10,42 +10,40 @@ def with_break_for(): def with_break_while(): i: i32 = 0 while i < 4: - print(i) + i += 1 break else: - print(10) assert False def no_break_for(): i: i32 + j: i32 = 0 for i in range(2): - print(i) + j += 1 else: - print(10) + assert j == 2 return assert False def break_in_if_for(): i: i32 + j: i32 = 0 for i in range(2): - print(i) + j += 1 if i == 1: break else: - print(10) assert False + assert j == 2 def nested_loop_for_for(): i: i32 j: i32 for i in range(2): - print("outer: " + str(i)) for j in range(10, 20): - print(" inner: " + str(j)) break else: - print("no break in outer loop") return assert False @@ -53,12 +51,9 @@ def nested_loop_for_while(): i: i32 j: i32 = 10 for i in range(2): - print("outer: " + str(i)) while j < 20: - print(" inner: " + str(j)) break else: - print("no break in outer loop") return assert False @@ -66,13 +61,11 @@ def nested_loop_while_for(): i: i32 = 0 j: i32 while i < 2: - print("outer: " + str(i)) i += 1 for j in range(10, 20): - print(" inner: " + str(j)) break else: - print("no break in outer loop") + assert i == 2 return assert False @@ -80,27 +73,28 @@ def nested_loop_while_while(): i: i32 = 0 j: i32 = 10 while i < 2: - print("outer: " + str(i)) i += 1 while j < 20: - print(" inner: " + str(j)) break else: - print("no break in outer loop") + assert i == 2 return assert False def nested_loop_else(): i: i32 j: i32 + l: i32 = 0 for i in range(2): - print("outer: " + str(i)) + l += 1 + m: i32 = 0 for j in range(10, 12): - print(" inner: " + str(j)) + m += 1 else: - print("no break in inner loop") + assert m == 2 + l += 10 else: - print("no break in outer loop") + assert l == 22 return assert False From d8a8b19191b23700713b448ab12376fd49a2fbc2 Mon Sep 17 00:00:00 2001 From: advik Date: Thu, 4 Apr 2024 01:14:30 +0530 Subject: [PATCH 5/5] Add print statements in tests --- integration_tests/loop_10.py | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/integration_tests/loop_10.py b/integration_tests/loop_10.py index 113704f7e9..6f9f0defb9 100644 --- a/integration_tests/loop_10.py +++ b/integration_tests/loop_10.py @@ -22,6 +22,7 @@ def no_break_for(): for i in range(2): j += 1 else: + print(j) assert j == 2 return assert False @@ -35,68 +36,83 @@ def break_in_if_for(): break else: assert False + print(j) assert j == 2 def nested_loop_for_for(): i: i32 j: i32 + m: i32 = 0 for i in range(2): for j in range(10, 20): break else: - return - assert False + m = 10 + print(m) + assert m == 10 def nested_loop_for_while(): i: i32 j: i32 = 10 + m: i32 = 0 for i in range(2): while j < 20: break else: - return - assert False + m = 10 + print(m) + assert m == 10 def nested_loop_while_for(): i: i32 = 0 j: i32 + m: i32 = 0 while i < 2: i += 1 for j in range(10, 20): break else: + print(i) assert i == 2 - return - assert False + m = 10 + print(m) + assert m == 10 def nested_loop_while_while(): i: i32 = 0 j: i32 = 10 + m: i32 = 0 while i < 2: i += 1 while j < 20: break else: + print(i) assert i == 2 - return - assert False + m = 10 + print(m) + assert m == 10 def nested_loop_else(): i: i32 j: i32 l: i32 = 0 + m: i32 = 0 for i in range(2): l += 1 m: i32 = 0 for j in range(10, 12): m += 1 else: + print(m) assert m == 2 l += 10 else: + print(l) assert l == 22 - return - assert False + m = 10 + print(m) + assert m == 10 with_break_for()