@@ -3572,6 +3572,68 @@ pm_hash_node_closing_loc_set(pm_hash_node_t *hash, pm_token_t *token) {
3572
3572
hash->closing_loc = PM_LOCATION_TOKEN_VALUE(token);
3573
3573
}
3574
3574
3575
+ static pm_node_t *
3576
+ pm_assignment_value_node(pm_node_t *node) {
3577
+ switch (PM_NODE_TYPE(node)) {
3578
+ case PM_CLASS_VARIABLE_WRITE_NODE: {
3579
+ const pm_class_variable_write_node_t *cast = (pm_class_variable_write_node_t *)node;
3580
+ return cast->value;
3581
+ }
3582
+ case PM_CONSTANT_WRITE_NODE: {
3583
+ const pm_constant_write_node_t *cast = (pm_constant_write_node_t *)node;
3584
+ return cast->value;
3585
+ }
3586
+ case PM_GLOBAL_VARIABLE_WRITE_NODE: {
3587
+ const pm_global_variable_write_node_t *cast = (pm_global_variable_write_node_t *)node;
3588
+ return cast->value;
3589
+ }
3590
+ case PM_INSTANCE_VARIABLE_WRITE_NODE: {
3591
+ const pm_instance_variable_write_node_t *cast = (pm_instance_variable_write_node_t *)node;
3592
+ return cast->value;
3593
+ }
3594
+ case PM_LOCAL_VARIABLE_WRITE_NODE: {
3595
+ const pm_local_variable_write_node_t *cast = (pm_local_variable_write_node_t *)node;
3596
+ return cast->value;
3597
+ }
3598
+ case PM_MULTI_WRITE_NODE: {
3599
+ const pm_multi_write_node_t *cast = (pm_multi_write_node_t *)node;
3600
+ return cast->value;
3601
+ }
3602
+ case PM_PARENTHESES_NODE: {
3603
+ const pm_parentheses_node_t *cast = (pm_parentheses_node_t *)node;
3604
+ if (cast->body != NULL) {
3605
+ return pm_assignment_value_node(cast->body);
3606
+ }
3607
+ return NULL;
3608
+ }
3609
+ case PM_BEGIN_NODE: {
3610
+ const pm_begin_node_t *cast = (pm_begin_node_t *)node;
3611
+ if (cast->statements != NULL) {
3612
+ return pm_assignment_value_node((pm_node_t *) cast->statements);
3613
+ }
3614
+ return NULL;
3615
+ }
3616
+ case PM_STATEMENTS_NODE: {
3617
+ const pm_statements_node_t *cast = (const pm_statements_node_t *) node;
3618
+ return pm_assignment_value_node(cast->body.nodes[cast->body.size - 1]);
3619
+ }
3620
+ default:
3621
+ return NULL;
3622
+ }
3623
+ }
3624
+
3625
+ /**
3626
+ * Check whether the predicate contains an assigment where the assigned value is a
3627
+ * literal. If such an assignment is found, it generates a warning.
3628
+ */
3629
+ static void
3630
+ pm_check_predicate_assignment(pm_parser_t *parser, pm_node_t *predicate) {
3631
+ pm_node_t *value = pm_assignment_value_node(predicate);
3632
+ if ((value != NULL) && PM_NODE_FLAG_P(value, PM_NODE_FLAG_STATIC_LITERAL)) {
3633
+ pm_parser_warn_token(parser, &parser->current, PM_WARN_EQUAL_IN_CONDITIONAL);
3634
+ }
3635
+ }
3636
+
3575
3637
/**
3576
3638
* Allocate a new IfNode node.
3577
3639
*/
@@ -3585,6 +3647,7 @@ pm_if_node_create(pm_parser_t *parser,
3585
3647
const pm_token_t *end_keyword
3586
3648
) {
3587
3649
pm_conditional_predicate(predicate);
3650
+ pm_check_predicate_assignment(parser, predicate);
3588
3651
pm_if_node_t *node = PM_ALLOC_NODE(parser, pm_if_node_t);
3589
3652
3590
3653
const uint8_t *end;
@@ -3624,6 +3687,7 @@ pm_if_node_create(pm_parser_t *parser,
3624
3687
static pm_if_node_t *
3625
3688
pm_if_node_modifier_create(pm_parser_t *parser, pm_node_t *statement, const pm_token_t *if_keyword, pm_node_t *predicate) {
3626
3689
pm_conditional_predicate(predicate);
3690
+ pm_check_predicate_assignment(parser, predicate);
3627
3691
pm_if_node_t *node = PM_ALLOC_NODE(parser, pm_if_node_t);
3628
3692
3629
3693
pm_statements_node_t *statements = pm_statements_node_create(parser);
@@ -3656,6 +3720,7 @@ static pm_if_node_t *
3656
3720
pm_if_node_ternary_create(pm_parser_t *parser, pm_node_t *predicate, const pm_token_t *qmark, pm_node_t *true_expression, const pm_token_t *colon, pm_node_t *false_expression) {
3657
3721
pm_assert_value_expression(parser, predicate);
3658
3722
pm_conditional_predicate(predicate);
3723
+ pm_check_predicate_assignment(parser, predicate);
3659
3724
3660
3725
pm_statements_node_t *if_statements = pm_statements_node_create(parser);
3661
3726
pm_statements_node_body_append(if_statements, true_expression);
@@ -5899,6 +5964,7 @@ pm_undef_node_append(pm_undef_node_t *node, pm_node_t *name) {
5899
5964
static pm_unless_node_t *
5900
5965
pm_unless_node_create(pm_parser_t *parser, const pm_token_t *keyword, pm_node_t *predicate, const pm_token_t *then_keyword, pm_statements_node_t *statements) {
5901
5966
pm_conditional_predicate(predicate);
5967
+ pm_check_predicate_assignment(parser, predicate);
5902
5968
pm_unless_node_t *node = PM_ALLOC_NODE(parser, pm_unless_node_t);
5903
5969
5904
5970
const uint8_t *end;
@@ -5934,6 +6000,7 @@ pm_unless_node_create(pm_parser_t *parser, const pm_token_t *keyword, pm_node_t
5934
6000
static pm_unless_node_t *
5935
6001
pm_unless_node_modifier_create(pm_parser_t *parser, pm_node_t *statement, const pm_token_t *unless_keyword, pm_node_t *predicate) {
5936
6002
pm_conditional_predicate(predicate);
6003
+ pm_check_predicate_assignment(parser, predicate);
5937
6004
pm_unless_node_t *node = PM_ALLOC_NODE(parser, pm_unless_node_t);
5938
6005
5939
6006
pm_statements_node_t *statements = pm_statements_node_create(parser);
@@ -5971,6 +6038,7 @@ pm_unless_node_end_keyword_loc_set(pm_unless_node_t *node, const pm_token_t *end
5971
6038
static pm_until_node_t *
5972
6039
pm_until_node_create(pm_parser_t *parser, const pm_token_t *keyword, const pm_token_t *closing, pm_node_t *predicate, pm_statements_node_t *statements, pm_node_flags_t flags) {
5973
6040
pm_until_node_t *node = PM_ALLOC_NODE(parser, pm_until_node_t);
6041
+ pm_check_predicate_assignment(parser, predicate);
5974
6042
5975
6043
*node = (pm_until_node_t) {
5976
6044
{
@@ -5996,6 +6064,7 @@ pm_until_node_create(pm_parser_t *parser, const pm_token_t *keyword, const pm_to
5996
6064
static pm_until_node_t *
5997
6065
pm_until_node_modifier_create(pm_parser_t *parser, const pm_token_t *keyword, pm_node_t *predicate, pm_statements_node_t *statements, pm_node_flags_t flags) {
5998
6066
pm_until_node_t *node = PM_ALLOC_NODE(parser, pm_until_node_t);
6067
+ pm_check_predicate_assignment(parser, predicate);
5999
6068
6000
6069
*node = (pm_until_node_t) {
6001
6070
{
@@ -6065,6 +6134,7 @@ pm_when_node_statements_set(pm_when_node_t *node, pm_statements_node_t *statemen
6065
6134
static pm_while_node_t *
6066
6135
pm_while_node_create(pm_parser_t *parser, const pm_token_t *keyword, const pm_token_t *closing, pm_node_t *predicate, pm_statements_node_t *statements, pm_node_flags_t flags) {
6067
6136
pm_while_node_t *node = PM_ALLOC_NODE(parser, pm_while_node_t);
6137
+ pm_check_predicate_assignment(parser, predicate);
6068
6138
6069
6139
*node = (pm_while_node_t) {
6070
6140
{
@@ -6090,6 +6160,7 @@ pm_while_node_create(pm_parser_t *parser, const pm_token_t *keyword, const pm_to
6090
6160
static pm_while_node_t *
6091
6161
pm_while_node_modifier_create(pm_parser_t *parser, const pm_token_t *keyword, pm_node_t *predicate, pm_statements_node_t *statements, pm_node_flags_t flags) {
6092
6162
pm_while_node_t *node = PM_ALLOC_NODE(parser, pm_while_node_t);
6163
+ pm_check_predicate_assignment(parser, predicate);
6093
6164
6094
6165
*node = (pm_while_node_t) {
6095
6166
{
@@ -15864,6 +15935,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
15864
15935
} else {
15865
15936
receiver = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_NOT_EXPRESSION);
15866
15937
pm_conditional_predicate(receiver);
15938
+ pm_check_predicate_assignment(parser, receiver);
15867
15939
15868
15940
if (!parser->recovering) {
15869
15941
accept1(parser, PM_TOKEN_NEWLINE);
@@ -15874,6 +15946,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
15874
15946
} else {
15875
15947
receiver = parse_expression(parser, PM_BINDING_POWER_NOT, true, PM_ERR_NOT_EXPRESSION);
15876
15948
pm_conditional_predicate(receiver);
15949
+ pm_check_predicate_assignment(parser, receiver);
15877
15950
}
15878
15951
15879
15952
return (pm_node_t *) pm_call_node_not_create(parser, receiver, &message, &arguments);
@@ -16544,6 +16617,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
16544
16617
pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "!");
16545
16618
16546
16619
pm_conditional_predicate(receiver);
16620
+ pm_check_predicate_assignment(parser, receiver);
16547
16621
return (pm_node_t *) node;
16548
16622
}
16549
16623
case PM_TOKEN_TILDE: {
0 commit comments