summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2025-12-05 18:54:43 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2026-02-04 13:28:33 +0900
commit4f360107387c47bfd82e7010b8eb7393575d4d76 (patch)
treebf3c28f59ac7281d6d8835f4347f17b82bd55fe6
parentc8b2a453d0fe099064e095d165ce38ee8c3eef38 (diff)
[Bug #21669] Fix void value expression check for `rescue`-else
If `rescue`-else node is void, the `rescue`-body is also void.
-rw-r--r--parse.y4
-rw-r--r--test/ruby/test_syntax.rb11
2 files changed, 14 insertions, 1 deletions
diff --git a/parse.y b/parse.y
index b20141680e..7efc7a7ea5 100644
--- a/parse.y
+++ b/parse.y
@@ -13839,7 +13839,9 @@ value_expr_check(struct parser_params *p, NODE *node)
case NODE_RESCUE:
/* void only if all children are void */
vn = RNODE_RESCUE(node)->nd_head;
- if (!vn || !(vn = value_expr_check(p, vn))) return NULL;
+ if (!vn || !(vn = value_expr_check(p, vn))) {
+ if (!RNODE_RESCUE(node)->nd_else) return NULL;
+ }
if (!void_node) void_node = vn;
for (NODE *r = RNODE_RESCUE(node)->nd_resq; r; r = RNODE_RESBODY(r)->nd_next) {
if (!nd_type_p(r, NODE_RESBODY)) {
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index 79e373ea66..9a14375056 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -2040,6 +2040,17 @@ eom
return
end
};
+
+ assert_syntax_error("#{<<~"{#"}\n#{<<~'};'}", /void value expression/, nil, "#{BUG_21669} 1.2")
+ {#
+ x = begin
+ foo
+ rescue
+ return
+ else
+ return
+ end
+ };
end
def test_tautological_condition