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:
parent
ae6c44ea15
commit
96b5ec10fb
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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" \
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user