summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-09-25 14:16:58 -0400
committergit <svn-admin@ruby-lang.org>2024-09-25 18:34:51 +0000
commit12cf9f2ae57f84278cbee8bc20d2af697efc66f1 (patch)
treea0759c83a10df30f9aa22aa7ecf0b0cba8b4f039
parent768ceceb12c7947030132007b91d5bdb97a8839c (diff)
[ruby/prism] Fix up void value expression checking for rescue
https://github.com/ruby/prism/commit/509ff88e92
-rw-r--r--prism/prism.c47
-rw-r--r--test/prism/errors/void_value_expression_in_begin_statement.txt2
2 files changed, 34 insertions, 15 deletions
diff --git a/prism/prism.c b/prism/prism.c
index 6732e9ef2b..443a15a11c 100644
--- a/prism/prism.c
+++ b/prism/prism.c
@@ -1034,7 +1034,7 @@ pm_parser_optional_constant_id_token(pm_parser_t *parser, const pm_token_t *toke
*/
static pm_node_t *
pm_check_value_expression(pm_parser_t *parser, pm_node_t *node) {
- pm_node_t* void_node = NULL;
+ pm_node_t *void_node = NULL;
while (node != NULL) {
switch (PM_NODE_TYPE(node)) {
@@ -1050,24 +1050,43 @@ pm_check_value_expression(pm_parser_t *parser, pm_node_t *node) {
case PM_BEGIN_NODE: {
pm_begin_node_t *cast = (pm_begin_node_t *) node;
- if (cast->statements == NULL && cast->ensure_clause != NULL) {
- node = (pm_node_t *) cast->ensure_clause;
- }
- else {
+ if (cast->ensure_clause != NULL) {
if (cast->rescue_clause != NULL) {
- if (cast->rescue_clause->statements == NULL) {
- return NULL;
- }
- else if (cast->else_clause != NULL) {
- node = (pm_node_t *) cast->else_clause;
+ pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->rescue_clause);
+ if (vn != NULL) return vn;
+ }
+
+ if (cast->statements != NULL) {
+ pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->statements);
+ if (vn != NULL) return vn;
+ }
+
+ node = (pm_node_t *) cast->ensure_clause;
+ } else if (cast->rescue_clause != NULL) {
+ if (cast->statements == NULL) return NULL;
+
+ pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->statements);
+ if (vn == NULL) return NULL;
+ if (void_node == NULL) void_node = vn;
+
+ for (pm_rescue_node_t *rescue_clause = cast->rescue_clause; rescue_clause != NULL; rescue_clause = rescue_clause->subsequent) {
+ pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) rescue_clause->statements);
+ if (vn == NULL) {
+ void_node = NULL;
+ break;
}
- else {
- node = (pm_node_t *) cast->statements;
+ if (void_node == NULL) {
+ void_node = vn;
}
}
- else {
- node = (pm_node_t *) cast->statements;
+
+ if (cast->else_clause != NULL) {
+ node = (pm_node_t *) cast->else_clause;
+ } else {
+ return void_node;
}
+ } else {
+ node = (pm_node_t *) cast->statements;
}
break;
diff --git a/test/prism/errors/void_value_expression_in_begin_statement.txt b/test/prism/errors/void_value_expression_in_begin_statement.txt
index 4ad40b684d..aa8f1ded96 100644
--- a/test/prism/errors/void_value_expression_in_begin_statement.txt
+++ b/test/prism/errors/void_value_expression_in_begin_statement.txt
@@ -15,7 +15,7 @@ x = begin return ensure return end
x = begin return; rescue; return end
^~~~~~ unexpected void value expression
x = begin return; rescue; return; else return end
- ^~~~~~ unexpected void value expression
+ ^~~~~~ unexpected void value expression
x = begin; return; rescue; retry; end
^~~~~~ unexpected void value expression