diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2019-01-03 23:34:36 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2019-01-03 23:34:36 +0100 |
commit | 96b5ec10fb8abdb8050a6af87330e6cf3d881d5a (patch) | |
tree | 8fbc53fb1f7057170415adf6516319dcba2e7cdc | |
parent | ae6c44ea15f4b73e8e5532f6392d1e6ce8c087e7 (diff) | |
download | busybox-w32-96b5ec10fb8abdb8050a6af87330e6cf3d881d5a.tar.gz busybox-w32-96b5ec10fb8abdb8050a6af87330e6cf3d881d5a.tar.bz2 busybox-w32-96b5ec10fb8abdb8050a6af87330e6cf3d881d5a.zip |
bc: fix "...; return}" to work, disallow "return ()"
function old new delta
zbc_parse_expr 24 1865 +1841
zbc_parse_stmt_possibly_auto 1425 1413 -12
bc_parse_expr_empty_ok 1843 - -1843
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 1/1 up/down: 1841/-1855) Total: -14 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | miscutils/bc.c | 13 | ||||
-rwxr-xr-x | testsuite/bc.tests | 5 | ||||
-rw-r--r-- | testsuite/bc_misc1.bc | 4 |
3 files changed, 11 insertions, 11 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index e5726ca40..6d8e2d991 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c | |||
@@ -4121,18 +4121,15 @@ static BC_STATUS zbc_parse_return(void) | |||
4121 | if (s) RETURN_STATUS(s); | 4121 | if (s) RETURN_STATUS(s); |
4122 | 4122 | ||
4123 | t = p->lex; | 4123 | t = p->lex; |
4124 | if (t == XC_LEX_NLINE || t == BC_LEX_SCOLON) | 4124 | if (t == XC_LEX_NLINE || t == BC_LEX_SCOLON || t == BC_LEX_RBRACE) |
4125 | xc_parse_push(BC_INST_RET0); | 4125 | xc_parse_push(BC_INST_RET0); |
4126 | else { | 4126 | else { |
4127 | bool paren = (t == BC_LEX_LPAREN); | 4127 | s = zbc_parse_expr(0); |
4128 | s = bc_parse_expr_empty_ok(0); | ||
4129 | if (s == BC_STATUS_PARSE_EMPTY_EXP) { | ||
4130 | xc_parse_push(BC_INST_RET0); | ||
4131 | s = zxc_lex_next(); | ||
4132 | } | ||
4133 | if (s) RETURN_STATUS(s); | 4128 | if (s) RETURN_STATUS(s); |
4134 | 4129 | ||
4135 | if (!paren || p->lex_last != BC_LEX_RPAREN) { | 4130 | if (t != BC_LEX_LPAREN // "return EXPR", no () |
4131 | || p->lex_last != BC_LEX_RPAREN // example: "return (a) + b" | ||
4132 | ) { | ||
4136 | s = zbc_POSIX_requires("parentheses around return expressions"); | 4133 | s = zbc_POSIX_requires("parentheses around return expressions"); |
4137 | if (s) RETURN_STATUS(s); | 4134 | if (s) RETURN_STATUS(s); |
4138 | } | 4135 | } |
diff --git a/testsuite/bc.tests b/testsuite/bc.tests index 7795183a7..0a8222be6 100755 --- a/testsuite/bc.tests +++ b/testsuite/bc.tests | |||
@@ -103,6 +103,11 @@ testing "bc for (;;) {break}" \ | |||
103 | "2\n9\n" \ | 103 | "2\n9\n" \ |
104 | "" "for (;;) {2;break}; 9" | 104 | "" "for (;;) {2;break}; 9" |
105 | 105 | ||
106 | testing "bc define {return}" \ | ||
107 | "bc" \ | ||
108 | "0\n9\n" \ | ||
109 | "" "define w() {return}\nw();9" | ||
110 | |||
106 | testing "bc define auto" \ | 111 | testing "bc define auto" \ |
107 | "bc" \ | 112 | "bc" \ |
108 | "8\n9\n" \ | 113 | "8\n9\n" \ |
diff --git a/testsuite/bc_misc1.bc b/testsuite/bc_misc1.bc index 7e9d96604..f666d701a 100644 --- a/testsuite/bc_misc1.bc +++ b/testsuite/bc_misc1.bc | |||
@@ -4,9 +4,7 @@ define x(x) { | |||
4 | define y() { | 4 | define y() { |
5 | return; | 5 | return; |
6 | } | 6 | } |
7 | define z() { | 7 | define z() {return} |
8 | return (); | ||
9 | } | ||
10 | scale = 0 | 8 | scale = 0 |
11 | x=2 | 9 | x=2 |
12 | x[0]=3 | 10 | x[0]=3 |