@@ -584,6 +584,15 @@ pm_parser_warn_token(pm_parser_t *parser, const pm_token_t *token, pm_diagnostic
584
584
pm_parser_warn(parser, token->start, token->end, diag_id);
585
585
}
586
586
587
+ /**
588
+ * Append a warning to the list of warnings on the parser using the location of
589
+ * the given node.
590
+ */
591
+ static inline void
592
+ pm_parser_warn_node(pm_parser_t *parser, const pm_node_t *node, pm_diagnostic_id_t diag_id) {
593
+ pm_parser_warn(parser, node->location.start, node->location.end, diag_id);
594
+ }
595
+
587
596
/******************************************************************************/
588
597
/* Node-related functions */
589
598
/******************************************************************************/
@@ -725,6 +734,17 @@ pm_assert_value_expression(pm_parser_t *parser, pm_node_t *node) {
725
734
}
726
735
}
727
736
737
+ /**
738
+ * Check one side of a flip-flop for integer literals. If -e was not supplied at
739
+ * the command-line, then warn.
740
+ */
741
+ static inline void
742
+ pm_flip_flop_predicate(pm_parser_t *parser, pm_node_t *node) {
743
+ if (PM_NODE_TYPE_P(node, PM_INTEGER_NODE) && !(parser->command_line & PM_OPTIONS_COMMAND_LINE_E)) {
744
+ pm_parser_warn_node(parser, node, PM_WARN_INTEGER_IN_FLIP_FLOP);
745
+ }
746
+ }
747
+
728
748
/**
729
749
* The predicate of conditional nodes can change what would otherwise be regular
730
750
* nodes into specialized nodes. For example:
@@ -735,37 +755,40 @@ pm_assert_value_expression(pm_parser_t *parser, pm_node_t *node) {
735
755
* if /foo #{bar}/ => InterpolatedRegularExpressionNode becomes InterpolatedMatchLastLineNode
736
756
*/
737
757
static void
738
- pm_conditional_predicate(pm_node_t *node) {
758
+ pm_conditional_predicate(pm_parser_t *parser, pm_node_t *node) {
739
759
switch (PM_NODE_TYPE(node)) {
740
760
case PM_AND_NODE: {
741
761
pm_and_node_t *cast = (pm_and_node_t *) node;
742
- pm_conditional_predicate(cast->left);
743
- pm_conditional_predicate(cast->right);
762
+ pm_conditional_predicate(parser, cast->left);
763
+ pm_conditional_predicate(parser, cast->right);
744
764
break;
745
765
}
746
766
case PM_OR_NODE: {
747
767
pm_or_node_t *cast = (pm_or_node_t *) node;
748
- pm_conditional_predicate(cast->left);
749
- pm_conditional_predicate(cast->right);
768
+ pm_conditional_predicate(parser, cast->left);
769
+ pm_conditional_predicate(parser, cast->right);
750
770
break;
751
771
}
752
772
case PM_PARENTHESES_NODE: {
753
773
pm_parentheses_node_t *cast = (pm_parentheses_node_t *) node;
754
774
755
775
if ((cast->body != NULL) && PM_NODE_TYPE_P(cast->body, PM_STATEMENTS_NODE)) {
756
776
pm_statements_node_t *statements = (pm_statements_node_t *) cast->body;
757
- if (statements->body.size == 1) pm_conditional_predicate(statements->body.nodes[0]);
777
+ if (statements->body.size == 1) pm_conditional_predicate(parser, statements->body.nodes[0]);
758
778
}
759
779
760
780
break;
761
781
}
762
782
case PM_RANGE_NODE: {
763
783
pm_range_node_t *cast = (pm_range_node_t *) node;
784
+
764
785
if (cast->left) {
765
- pm_conditional_predicate(cast->left);
786
+ pm_flip_flop_predicate(parser, cast->left);
787
+ pm_conditional_predicate(parser, cast->left);
766
788
}
767
789
if (cast->right) {
768
- pm_conditional_predicate(cast->right);
790
+ pm_flip_flop_predicate(parser, cast->right);
791
+ pm_conditional_predicate(parser, cast->right);
769
792
}
770
793
771
794
// Here we change the range node into a flip flop node. We can do
@@ -3778,7 +3801,7 @@ pm_if_node_create(pm_parser_t *parser,
3778
3801
pm_node_t *consequent,
3779
3802
const pm_token_t *end_keyword
3780
3803
) {
3781
- pm_conditional_predicate(predicate);
3804
+ pm_conditional_predicate(parser, predicate);
3782
3805
pm_predicate_check(parser, predicate);
3783
3806
pm_if_node_t *node = PM_ALLOC_NODE(parser, pm_if_node_t);
3784
3807
@@ -3818,7 +3841,7 @@ pm_if_node_create(pm_parser_t *parser,
3818
3841
*/
3819
3842
static pm_if_node_t *
3820
3843
pm_if_node_modifier_create(pm_parser_t *parser, pm_node_t *statement, const pm_token_t *if_keyword, pm_node_t *predicate) {
3821
- pm_conditional_predicate(predicate);
3844
+ pm_conditional_predicate(parser, predicate);
3822
3845
pm_predicate_check(parser, predicate);
3823
3846
pm_if_node_t *node = PM_ALLOC_NODE(parser, pm_if_node_t);
3824
3847
@@ -3851,7 +3874,7 @@ pm_if_node_modifier_create(pm_parser_t *parser, pm_node_t *statement, const pm_t
3851
3874
static pm_if_node_t *
3852
3875
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) {
3853
3876
pm_assert_value_expression(parser, predicate);
3854
- pm_conditional_predicate(predicate);
3877
+ pm_conditional_predicate(parser, predicate);
3855
3878
pm_predicate_check(parser, predicate);
3856
3879
3857
3880
pm_statements_node_t *if_statements = pm_statements_node_create(parser);
@@ -6161,7 +6184,7 @@ pm_undef_node_append(pm_undef_node_t *node, pm_node_t *name) {
6161
6184
*/
6162
6185
static pm_unless_node_t *
6163
6186
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) {
6164
- pm_conditional_predicate(predicate);
6187
+ pm_conditional_predicate(parser, predicate);
6165
6188
pm_predicate_check(parser, predicate);
6166
6189
pm_unless_node_t *node = PM_ALLOC_NODE(parser, pm_unless_node_t);
6167
6190
@@ -6197,7 +6220,7 @@ pm_unless_node_create(pm_parser_t *parser, const pm_token_t *keyword, pm_node_t
6197
6220
*/
6198
6221
static pm_unless_node_t *
6199
6222
pm_unless_node_modifier_create(pm_parser_t *parser, pm_node_t *statement, const pm_token_t *unless_keyword, pm_node_t *predicate) {
6200
- pm_conditional_predicate(predicate);
6223
+ pm_conditional_predicate(parser, predicate);
6201
6224
pm_predicate_check(parser, predicate);
6202
6225
pm_unless_node_t *node = PM_ALLOC_NODE(parser, pm_unless_node_t);
6203
6226
@@ -16317,7 +16340,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
16317
16340
arguments.closing_loc = PM_LOCATION_TOKEN_VALUE(&parser->previous);
16318
16341
} else {
16319
16342
receiver = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_NOT_EXPRESSION);
16320
- pm_conditional_predicate(receiver);
16343
+ pm_conditional_predicate(parser, receiver);
16321
16344
pm_predicate_check(parser, receiver);
16322
16345
16323
16346
if (!parser->recovering) {
@@ -16328,7 +16351,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
16328
16351
}
16329
16352
} else {
16330
16353
receiver = parse_expression(parser, PM_BINDING_POWER_NOT, true, PM_ERR_NOT_EXPRESSION);
16331
- pm_conditional_predicate(receiver);
16354
+ pm_conditional_predicate(parser, receiver);
16332
16355
pm_predicate_check(parser, receiver);
16333
16356
}
16334
16357
@@ -17006,7 +17029,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
17006
17029
pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, binding_power < PM_BINDING_POWER_MATCH, PM_ERR_UNARY_RECEIVER);
17007
17030
pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "!");
17008
17031
17009
- pm_conditional_predicate(receiver);
17032
+ pm_conditional_predicate(parser, receiver);
17010
17033
pm_predicate_check(parser, receiver);
17011
17034
return (pm_node_t *) node;
17012
17035
}
0 commit comments