[git commit branch/1_30_stable] bc: fix "...; return}" to work, disallow "return ()"

Denys Vlasenko vda.linux at googlemail.com
Thu Feb 14 13:40:57 UTC 2019


commit: https://git.busybox.net/busybox/commit/?id=56e09e93bd9e4cdc75c77d9e7c8db3548bdbf089
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/1_30_stable

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 at googlemail.com>
---
 miscutils/bc.c        | 13 +++++--------
 testsuite/bc.tests    |  5 +++++
 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)
 	if (s) RETURN_STATUS(s);
 
 	t = p->lex;
-	if (t == XC_LEX_NLINE || t == BC_LEX_SCOLON)
+	if (t == XC_LEX_NLINE || t == BC_LEX_SCOLON || t == BC_LEX_RBRACE)
 		xc_parse_push(BC_INST_RET0);
 	else {
-		bool paren = (t == BC_LEX_LPAREN);
-		s = bc_parse_expr_empty_ok(0);
-		if (s == BC_STATUS_PARSE_EMPTY_EXP) {
-			xc_parse_push(BC_INST_RET0);
-			s = zxc_lex_next();
-		}
+		s = zbc_parse_expr(0);
 		if (s) RETURN_STATUS(s);
 
-		if (!paren || p->lex_last != BC_LEX_RPAREN) {
+		if (t != BC_LEX_LPAREN   // "return EXPR", no ()
+		 || p->lex_last != BC_LEX_RPAREN  // example: "return (a) + b"
+		) {
 			s = zbc_POSIX_requires("parentheses around return expressions");
 			if (s) RETURN_STATUS(s);
 		}
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}" \
 	"2\n9\n" \
 	"" "for (;;) {2;break}; 9"
 
+testing "bc define {return}" \
+	"bc" \
+	"0\n9\n" \
+	"" "define w() {return}\nw();9"
+
 testing "bc define auto" \
 	"bc" \
 	"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) {
 define y() {
 	return;
 }
-define z() {
-	return ();
-}
+define z() {return}
 scale = 0
 x=2
 x[0]=3


More information about the busybox-cvs mailing list