[Bug #20217] return
with ensure
is a void value expression
This commit is contained in:
parent
d3e6bcd37f
commit
fed877c791
17
parse.y
17
parse.y
@ -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
|
||||
|
@ -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
|
||||
|
@ -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}
|
||||
|
Loading…
x
Reference in New Issue
Block a user