diff options
Diffstat (limited to 'tests/custom/04_bugs')
-rw-r--r-- | tests/custom/04_bugs/32_compiler_switch_patchlist_corruption | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/tests/custom/04_bugs/32_compiler_switch_patchlist_corruption b/tests/custom/04_bugs/32_compiler_switch_patchlist_corruption new file mode 100644 index 0000000..d256de5 --- /dev/null +++ b/tests/custom/04_bugs/32_compiler_switch_patchlist_corruption @@ -0,0 +1,75 @@ +When compiling a switch statement with duplicate `default` cases or a switch +statement with syntax errors before the body block, two error handling cases +were hit in the code that prematurely returned from the function without +resetting the compiler's patchlist pointer away from the on-stack patchlist +that had been set up for the switch statement. + +Upon processing a subsequent break or continue control statement, a realloc +was performed on the then invalid patchlist contents, triggering a +segmentation fault or libc assert. + +-- Testcase -- +{% + switch (1) { + default: break; + default: break; + } +%} +-- End -- + +-- Expect stderr -- +Syntax error: more than one switch default case +In line 4, byte 3: + + ` default: break;` + ^-- Near here + + +Syntax error: break must be inside loop or switch +In line 4, byte 12: + + ` default: break;` + Near here -------^ + + +Syntax error: Expecting expression +In line 5, byte 2: + + ` }` + ^-- Near here + + +-- End -- + + +-- Testcase -- +{% + switch (*) { + break; + } +%} +-- End -- + +-- Expect stderr -- +Syntax error: Expecting expression +In line 2, byte 10: + + ` switch (*) {` + Near here --^ + + +Syntax error: break must be inside loop or switch +In line 3, byte 3: + + ` break;` + ^-- Near here + + +Syntax error: Expecting expression +In line 4, byte 2: + + ` }` + ^-- Near here + + +-- End -- |