From 96b5ec10fb8abdb8050a6af87330e6cf3d881d5a Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 3 Jan 2019 23:34:36 +0100 Subject: 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 --- 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 -- cgit v1.2.3