Skip to content

Commit 760c898

Browse files
authored
Add nested loop tests for else clause in loops (#2630)
* Add nested loop tests for else clause in loops * Add nested else test * Fix bug in for else implementation * Update tests to use assert * Add print statements in tests
1 parent bd90464 commit 760c898

File tree

2 files changed

+84
-13
lines changed

2 files changed

+84
-13
lines changed

integration_tests/loop_10.py

+82-13
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
def with_break_for():
2-
i: i32
2+
i: i32 = 0
33
for i in range(4):
4-
print(i)
4+
i += 1
55
break
66
else:
77
assert False
@@ -10,48 +10,117 @@ def with_break_for():
1010
def with_break_while():
1111
i: i32 = 0
1212
while i < 4:
13-
print(i)
13+
i += 1
1414
break
1515
else:
16-
print(10)
1716
assert False
1817

1918

2019
def no_break_for():
2120
i: i32
21+
j: i32 = 0
2222
for i in range(2):
23-
print(i)
23+
j += 1
2424
else:
25-
print(10)
25+
print(j)
26+
assert j == 2
2627
return
2728
assert False
2829

2930
def break_in_if_for():
3031
i: i32
32+
j: i32 = 0
3133
for i in range(2):
32-
print(i)
34+
j += 1
3335
if i == 1:
3436
break
3537
else:
36-
print(10)
3738
assert False
39+
print(j)
40+
assert j == 2
3841

3942
def nested_loop_for_for():
4043
i: i32
4144
j: i32
45+
m: i32 = 0
4246
for i in range(2):
43-
print("outer: " + str(i))
4447
for j in range(10, 20):
45-
print(" inner: " + str(j))
4648
break
4749
else:
48-
print("no break in outer loop")
49-
return
50-
assert False
50+
m = 10
51+
print(m)
52+
assert m == 10
53+
54+
def nested_loop_for_while():
55+
i: i32
56+
j: i32 = 10
57+
m: i32 = 0
58+
for i in range(2):
59+
while j < 20:
60+
break
61+
else:
62+
m = 10
63+
print(m)
64+
assert m == 10
65+
66+
def nested_loop_while_for():
67+
i: i32 = 0
68+
j: i32
69+
m: i32 = 0
70+
while i < 2:
71+
i += 1
72+
for j in range(10, 20):
73+
break
74+
else:
75+
print(i)
76+
assert i == 2
77+
m = 10
78+
print(m)
79+
assert m == 10
80+
81+
def nested_loop_while_while():
82+
i: i32 = 0
83+
j: i32 = 10
84+
m: i32 = 0
85+
while i < 2:
86+
i += 1
87+
while j < 20:
88+
break
89+
else:
90+
print(i)
91+
assert i == 2
92+
m = 10
93+
print(m)
94+
assert m == 10
95+
96+
def nested_loop_else():
97+
i: i32
98+
j: i32
99+
l: i32 = 0
100+
m: i32 = 0
101+
for i in range(2):
102+
l += 1
103+
m: i32 = 0
104+
for j in range(10, 12):
105+
m += 1
106+
else:
107+
print(m)
108+
assert m == 2
109+
l += 10
110+
else:
111+
print(l)
112+
assert l == 22
113+
m = 10
114+
print(m)
115+
assert m == 10
51116

52117

53118
with_break_for()
54119
with_break_while()
55120
no_break_for()
56121
break_in_if_for()
57122
nested_loop_for_for()
123+
nested_loop_for_while()
124+
nested_loop_while_for()
125+
nested_loop_while_while()
126+
nested_loop_else()

src/libasr/pass/while_else.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class WhileLoopVisitor : public ASR::StatementWalkVisitor<WhileLoopVisitor>
7373
Creating a flag variable in case of a while-else loop
7474
Creates an if statement after the loop to check if the flag was changed
7575
*/
76+
ASR::WhileLoop_t &xx = const_cast<ASR::WhileLoop_t&>(x);
77+
transform_stmts(xx.m_body, xx.n_body);
7678
if (x.n_orelse > 0) {
7779
Vec<ASR::stmt_t*> result;
7880
result.reserve(al, 3);

0 commit comments

Comments
 (0)