@@ -1036,8 +1036,8 @@ pm_parser_optional_constant_id_token(pm_parser_t *parser, const pm_token_t *toke
1036
1036
* If the node is value node, it returns NULL.
1037
1037
* If not, it returns the pointer to the node to be inspected as "void expression".
1038
1038
*/
1039
- static pm_node_t*
1040
- pm_check_value_expression(pm_node_t *node) {
1039
+ static pm_node_t *
1040
+ pm_check_value_expression(pm_parser_t *parser, pm_node_t *node) {
1041
1041
pm_node_t* void_node = NULL;
1042
1042
1043
1043
while (node != NULL) {
@@ -1096,7 +1096,7 @@ pm_check_value_expression(pm_node_t *node) {
1096
1096
if (cast->statements == NULL || cast->consequent == NULL) {
1097
1097
return NULL;
1098
1098
}
1099
- pm_node_t *vn = pm_check_value_expression((pm_node_t *) cast->statements);
1099
+ pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->statements);
1100
1100
if (vn == NULL) {
1101
1101
return NULL;
1102
1102
}
@@ -1111,7 +1111,7 @@ pm_check_value_expression(pm_node_t *node) {
1111
1111
if (cast->statements == NULL || cast->consequent == NULL) {
1112
1112
return NULL;
1113
1113
}
1114
- pm_node_t *vn = pm_check_value_expression((pm_node_t *) cast->statements);
1114
+ pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->statements);
1115
1115
if (vn == NULL) {
1116
1116
return NULL;
1117
1117
}
@@ -1136,6 +1136,15 @@ pm_check_value_expression(pm_node_t *node) {
1136
1136
node = cast->left;
1137
1137
break;
1138
1138
}
1139
+ case PM_LOCAL_VARIABLE_WRITE_NODE: {
1140
+ pm_local_variable_write_node_t *cast = (pm_local_variable_write_node_t *) node;
1141
+
1142
+ pm_scope_t *scope = parser->current_scope;
1143
+ for (uint32_t depth = 0; depth < cast->depth; depth++) scope = scope->previous;
1144
+
1145
+ pm_locals_read(&scope->locals, cast->name);
1146
+ return NULL;
1147
+ }
1139
1148
default:
1140
1149
return NULL;
1141
1150
}
@@ -1146,7 +1155,7 @@ pm_check_value_expression(pm_node_t *node) {
1146
1155
1147
1156
static inline void
1148
1157
pm_assert_value_expression(pm_parser_t *parser, pm_node_t *node) {
1149
- pm_node_t *void_node = pm_check_value_expression(node);
1158
+ pm_node_t *void_node = pm_check_value_expression(parser, node);
1150
1159
if (void_node != NULL) {
1151
1160
pm_parser_err_node(parser, void_node, PM_ERR_VOID_EXPRESSION);
1152
1161
}
@@ -1338,13 +1347,25 @@ static bool
1338
1347
pm_conditional_predicate_warn_write_literal_p(const pm_node_t *node) {
1339
1348
switch (PM_NODE_TYPE(node)) {
1340
1349
case PM_ARRAY_NODE: {
1350
+ if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) return true;
1351
+
1341
1352
const pm_array_node_t *cast = (const pm_array_node_t *) node;
1342
- const pm_node_t *element;
1353
+ for (size_t index = 0; index < cast->elements.size; index++) {
1354
+ if (!pm_conditional_predicate_warn_write_literal_p(cast->elements.nodes[index])) return false;
1355
+ }
1343
1356
1344
- PM_NODE_LIST_FOREACH(&cast->elements, index, element) {
1345
- if (!pm_conditional_predicate_warn_write_literal_p(element)) {
1346
- return false;
1347
- }
1357
+ return true;
1358
+ }
1359
+ case PM_HASH_NODE: {
1360
+ if (PM_NODE_FLAG_P(node, PM_NODE_FLAG_STATIC_LITERAL)) return true;
1361
+
1362
+ const pm_hash_node_t *cast = (const pm_hash_node_t *) node;
1363
+ for (size_t index = 0; index < cast->elements.size; index++) {
1364
+ const pm_node_t *element = cast->elements.nodes[index];
1365
+ if (!PM_NODE_TYPE_P(element, PM_ASSOC_NODE)) return false;
1366
+
1367
+ const pm_assoc_node_t *assoc = (const pm_assoc_node_t *) element;
1368
+ if (!pm_conditional_predicate_warn_write_literal_p(assoc->key) || !pm_conditional_predicate_warn_write_literal_p(assoc->value)) return false;
1348
1369
}
1349
1370
1350
1371
return true;
0 commit comments