Skip to content

Commit 509ff88

Browse files
committed
Fix up void value expression checking for rescue
1 parent 7753853 commit 509ff88

File tree

2 files changed

+34
-15
lines changed

2 files changed

+34
-15
lines changed

src/prism.c

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,7 +1034,7 @@ pm_parser_optional_constant_id_token(pm_parser_t *parser, const pm_token_t *toke
10341034
*/
10351035
static pm_node_t *
10361036
pm_check_value_expression(pm_parser_t *parser, pm_node_t *node) {
1037-
pm_node_t* void_node = NULL;
1037+
pm_node_t *void_node = NULL;
10381038

10391039
while (node != NULL) {
10401040
switch (PM_NODE_TYPE(node)) {
@@ -1050,24 +1050,43 @@ pm_check_value_expression(pm_parser_t *parser, pm_node_t *node) {
10501050
case PM_BEGIN_NODE: {
10511051
pm_begin_node_t *cast = (pm_begin_node_t *) node;
10521052

1053-
if (cast->statements == NULL && cast->ensure_clause != NULL) {
1054-
node = (pm_node_t *) cast->ensure_clause;
1055-
}
1056-
else {
1053+
if (cast->ensure_clause != NULL) {
10571054
if (cast->rescue_clause != NULL) {
1058-
if (cast->rescue_clause->statements == NULL) {
1059-
return NULL;
1060-
}
1061-
else if (cast->else_clause != NULL) {
1062-
node = (pm_node_t *) cast->else_clause;
1055+
pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->rescue_clause);
1056+
if (vn != NULL) return vn;
1057+
}
1058+
1059+
if (cast->statements != NULL) {
1060+
pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->statements);
1061+
if (vn != NULL) return vn;
1062+
}
1063+
1064+
node = (pm_node_t *) cast->ensure_clause;
1065+
} else if (cast->rescue_clause != NULL) {
1066+
if (cast->statements == NULL) return NULL;
1067+
1068+
pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->statements);
1069+
if (vn == NULL) return NULL;
1070+
if (void_node == NULL) void_node = vn;
1071+
1072+
for (pm_rescue_node_t *rescue_clause = cast->rescue_clause; rescue_clause != NULL; rescue_clause = rescue_clause->subsequent) {
1073+
pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) rescue_clause->statements);
1074+
if (vn == NULL) {
1075+
void_node = NULL;
1076+
break;
10631077
}
1064-
else {
1065-
node = (pm_node_t *) cast->statements;
1078+
if (void_node == NULL) {
1079+
void_node = vn;
10661080
}
10671081
}
1068-
else {
1069-
node = (pm_node_t *) cast->statements;
1082+
1083+
if (cast->else_clause != NULL) {
1084+
node = (pm_node_t *) cast->else_clause;
1085+
} else {
1086+
return void_node;
10701087
}
1088+
} else {
1089+
node = (pm_node_t *) cast->statements;
10711090
}
10721091

10731092
break;

test/prism/errors/void_value_expression_in_begin_statement.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ x = begin return ensure return end
1515
x = begin return; rescue; return end
1616
^~~~~~ unexpected void value expression
1717
x = begin return; rescue; return; else return end
18-
^~~~~~ unexpected void value expression
18+
^~~~~~ unexpected void value expression
1919
x = begin; return; rescue; retry; end
2020
^~~~~~ unexpected void value expression
2121

0 commit comments

Comments
 (0)