diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2024-01-28 11:09:55 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2024-01-28 18:44:09 +0900 |
commit | 5f733a1ae7e5fd20d4cba61af5408b33204fe8fc (patch) | |
tree | 9e8c9ac935241bb6d7bbf3fac2af28b9d5fa0f94 /parse.y | |
parent | fed877c791f1c16a2b1a2c9a167b7f433505794d (diff) |
[Bug #20217] `rescue` block is void only if all children are void
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 20 |
1 files changed, 20 insertions, 0 deletions
@@ -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: |