diff --git a/editors/awk.c b/editors/awk.c index d0e3781e7..f487163af 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 132afc6a9..9e6952ffd 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