summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2024-01-28 11:09:55 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2024-01-28 18:44:09 +0900
commit5f733a1ae7e5fd20d4cba61af5408b33204fe8fc (patch)
tree9e8c9ac935241bb6d7bbf3fac2af28b9d5fa0f94 /parse.y
parentfed877c791f1c16a2b1a2c9a167b7f433505794d (diff)
[Bug #20217] `rescue` block is void only if all children are void
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y20
1 files changed, 20 insertions, 0 deletions
diff --git a/parse.y b/parse.y
index 359a0cc261..5b9955a66a 100644
--- a/parse.y
+++ b/parse.y
@@ -14305,6 +14305,26 @@ value_expr_check(struct parser_params *p, NODE *node)
}
break;
+ 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 (!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)) {
+ compile_error(p, "unexpected node");
+ return NULL;
+ }
+ if (!(vn = value_expr_check(p, RNODE_RESBODY(r)->nd_body))) {
+ void_node = 0;
+ break;
+ }
+ if (!void_node) void_node = vn;
+ }
+ node = RNODE_RESCUE(node)->nd_else;
+ if (!node) return void_node;
+ break;
+
case NODE_RETURN:
case NODE_BREAK:
case NODE_NEXT: