diff options
author | Denys Vlasenko | 2014-06-26 16:40:28 +0200 |
---|---|---|
committer | Denys Vlasenko | 2014-06-26 16:40:28 +0200 |
commit | 5f8daefb835687e428215f90d26fdf1f0206149d (patch) | |
tree | b42723b59183e1bcf6196b37b34113d5a843fabb | |
parent | 0b0ccd457016d6a4eaa3e79bd65a852ea7d4294b (diff) | |
download | busybox-5f8daefb835687e428215f90d26fdf1f0206149d.zip busybox-5f8daefb835687e428215f90d26fdf1f0206149d.tar.gz |
awk: fix handling of "if ... break ; else ..." - closes 7226
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | editors/awk.c | 2 | ||||
-rwxr-xr-x | testsuite/awk.tests | 16 |
2 files changed, 18 insertions, 0 deletions
diff --git a/editors/awk.c b/editors/awk.c index d0e3781..f487163 100644 --- a/editors/awk.c +++ b/editors/awk.c @@ -1540,12 +1540,14 @@ static void chain_group(void) debug_printf_parse("%s: OC_BREAK\n", __func__); n = chain_node(OC_EXEC); n->a.n = break_ptr; + chain_expr(t_info); break; case OC_CONTINUE: debug_printf_parse("%s: OC_CONTINUE\n", __func__); n = chain_node(OC_EXEC); n->a.n = continue_ptr; + chain_expr(t_info); break; /* delete, next, nextfile, return, exit */ diff --git a/testsuite/awk.tests b/testsuite/awk.tests index 132afc6..9e6952f 100755 --- a/testsuite/awk.tests +++ b/testsuite/awk.tests @@ -295,6 +295,22 @@ testing "awk -e and ARGC" \ "" SKIP= +# The examples are in fact not valid awk programs (break/continue +# can only be used inside loops). +# But we do accept them outside of loops. +# We had a bug with misparsing "break ; else" sequence. +# Test that *that* bug is fixed, using simplest possible scripts: +testing "awk break" \ + "awk -f - 2>&1; echo \$?" \ + "0\n" \ + "" \ + 'BEGIN { if (1) break; else a = 1 }' +testing "awk continue" \ + "awk -f - 2>&1; echo \$?" \ + "0\n" \ + "" \ + 'BEGIN { if (1) continue; else a = 1 }' + # testing "description" "command" "result" "infile" "stdin" exit $FAILCOUNT |