summaryrefslogtreecommitdiffhomepage
path: root/tests/custom/03_bugs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/custom/03_bugs')
-rw-r--r--tests/custom/03_bugs/22_compile_break_continue_scoping59
1 files changed, 59 insertions, 0 deletions
diff --git a/tests/custom/03_bugs/22_compile_break_continue_scoping b/tests/custom/03_bugs/22_compile_break_continue_scoping
new file mode 100644
index 0000000..461b144
--- /dev/null
+++ b/tests/custom/03_bugs/22_compile_break_continue_scoping
@@ -0,0 +1,59 @@
+When compiling a break or continue statement, the compiler emitted pop
+instructions for local variables within the scope the break or continue
+keyword appeared in, but it must also pop local variables in enclosing
+scopes up until the scope of the containing loop or switch body.
+
+-- Expect stdout --
+1
+2
+3
+-- End --
+
+-- Testcase --
+{%
+ for (let i = 1; i <= 3; i++) {
+ while (true) {
+ let n = i;
+
+ print(n, "\n");
+
+ {
+ // The `let n` stack slot is not popped since it is
+ // outside of break's scope...
+ break;
+ }
+ }
+ }
+%}
+-- End --
+
+-- Expect stdout --
+1
+2
+3
+2
+4
+6
+3
+6
+9
+-- End --
+
+-- Testcase --
+{%
+ for (let i = 1; i <= 3; i++) {
+ for (let j = 1; j <= 3; j++) {
+ let n = i * j;
+
+ print(n, "\n");
+
+ if (j == 1)
+ {
+ // The `let n` stack slot is not popped since it is
+ // outside of continue's scope...
+ continue;
+ }
+ }
+ }
+%}
+-- End --