[Bug #20217] return with ensure is a void value expression

This commit is contained in:
Nobuyoshi Nakada 2024-01-28 01:02:11 +09:00
parent d3e6bcd37f
commit fed877c791
No known key found for this signature in database
GPG Key ID: 3582D74E1FEE4465
3 changed files with 21 additions and 4 deletions

17
parse.y
View File

@ -14296,12 +14296,21 @@ value_expr_check(struct parser_params *p, NODE *node)
}
while (node) {
switch (nd_type(node)) {
case NODE_ENSURE:
vn = RNODE_ENSURE(node)->nd_head;
node = RNODE_ENSURE(node)->nd_ensr;
/* nd_ensr should not be NULL, check it out next */
if (vn && (vn = value_expr_check(p, vn))) {
goto found;
}
break;
case NODE_RETURN:
case NODE_BREAK:
case NODE_NEXT:
case NODE_REDO:
case NODE_RETRY:
return void_node ? void_node : node;
goto found;
case NODE_CASE3:
if (!RNODE_CASE3(node)->nd_body || !nd_type_p(RNODE_CASE3(node)->nd_body, NODE_IN)) {
@ -14312,7 +14321,7 @@ value_expr_check(struct parser_params *p, NODE *node)
return NULL;
}
/* single line pattern matching with "=>" operator */
return void_node ? void_node : node;
goto found;
case NODE_BLOCK:
while (RNODE_BLOCK(node)->nd_next) {
@ -14356,6 +14365,10 @@ value_expr_check(struct parser_params *p, NODE *node)
}
return NULL;
found:
/* return the first found node */
return void_node ? void_node : node;
}
static int

View File

@ -1434,7 +1434,12 @@ x = __ENCODING__
def test_void_value_in_rhs
w = "void value expression"
["x = return 1", "x = return, 1", "x = 1, return", "x, y = return"].each do |code|
[
"x = return 1", "x = return, 1", "x = 1, return", "x, y = return",
"x = begin return ensure end",
"x = begin ensure return end",
"x = begin return ensure return end",
].each do |code|
ex = assert_syntax_error(code, w)
assert_equal(1, ex.message.scan(w).size, ->{"same #{w.inspect} warning should be just once\n#{w.message}"})
end

View File

@ -1411,7 +1411,6 @@ eom
"#{return}"
raise((return; "should not raise"))
begin raise; ensure return; end; self
begin raise; ensure return; end and self
nil&defined?0--begin e=no_method_error(); return; 0;end
return puts('ignored') #=> ignored
BEGIN {return}