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>
This commit is contained in:
Denys Vlasenko 2019-01-03 23:34:36 +01:00
parent ae6c44ea15
commit 96b5ec10fb
3 changed files with 11 additions and 11 deletions

View File

@ -4121,18 +4121,15 @@ static BC_STATUS zbc_parse_return(void)
if (s) RETURN_STATUS(s); if (s) RETURN_STATUS(s);
t = p->lex; 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); xc_parse_push(BC_INST_RET0);
else { else {
bool paren = (t == BC_LEX_LPAREN); s = zbc_parse_expr(0);
s = bc_parse_expr_empty_ok(0);
if (s == BC_STATUS_PARSE_EMPTY_EXP) {
xc_parse_push(BC_INST_RET0);
s = zxc_lex_next();
}
if (s) RETURN_STATUS(s); 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"); s = zbc_POSIX_requires("parentheses around return expressions");
if (s) RETURN_STATUS(s); if (s) RETURN_STATUS(s);
} }

View File

@ -103,6 +103,11 @@ testing "bc for (;;) {break}" \
"2\n9\n" \ "2\n9\n" \
"" "for (;;) {2;break}; 9" "" "for (;;) {2;break}; 9"
testing "bc define {return}" \
"bc" \
"0\n9\n" \
"" "define w() {return}\nw();9"
testing "bc define auto" \ testing "bc define auto" \
"bc" \ "bc" \
"8\n9\n" \ "8\n9\n" \

View File

@ -4,9 +4,7 @@ define x(x) {
define y() { define y() {
return; return;
} }
define z() { define z() {return}
return ();
}
scale = 0 scale = 0
x=2 x=2
x[0]=3 x[0]=3