Skip to content

Commit 2d81cfb

Browse files
mamesorah
authored andcommitted
Reject true && not true
A command-call-like `not true` must be rejected after `&&` and `||`. https://bugs.ruby-lang.org/issues/21337 ---- Early backport of ruby/prism#3585 due to its bug severity, but missed 3.4.5 release.
1 parent 4547de6 commit 2d81cfb

4 files changed

Lines changed: 31 additions & 0 deletions

File tree

prism/config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ errors:
101101
- EXPECT_FOR_DELIMITER
102102
- EXPECT_IDENT_REQ_PARAMETER
103103
- EXPECT_IN_DELIMITER
104+
- EXPECT_LPAREN_AFTER_NOT
104105
- EXPECT_LPAREN_REQ_PARAMETER
105106
- EXPECT_MESSAGE
106107
- EXPECT_RBRACKET

prism/prism.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19725,6 +19725,18 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
1972519725
pm_arguments_t arguments = { 0 };
1972619726
pm_node_t *receiver = NULL;
1972719727

19728+
if (!accepts_command_call && !match1(parser, PM_TOKEN_PARENTHESIS_LEFT)) {
19729+
if (parser->current.type == PM_TOKEN_PARENTHESIS_LEFT_PARENTHESES) {
19730+
pm_parser_err(parser, parser->previous.end, parser->previous.end + 1, PM_ERR_EXPECT_LPAREN_AFTER_NOT);
19731+
} else if (parser->current.type == PM_TOKEN_NEWLINE) {
19732+
parser_lex(parser);
19733+
pm_parser_err_current(parser, PM_ERR_EXPECT_LPAREN_AFTER_NOT);
19734+
} else {
19735+
pm_parser_err_current(parser, PM_ERR_EXPECT_LPAREN_AFTER_NOT);
19736+
}
19737+
return (pm_node_t *) pm_missing_node_create(parser, parser->current.start, parser->current.end);
19738+
}
19739+
1972819740
accept1(parser, PM_TOKEN_NEWLINE);
1972919741

1973019742
if (accept1(parser, PM_TOKEN_PARENTHESIS_LEFT)) {

prism/templates/src/diagnostic.c.erb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
184184
[PM_ERR_EXPECT_FOR_DELIMITER] = { "unexpected %s; expected a 'do', newline, or ';' after the 'for' loop collection", PM_ERROR_LEVEL_SYNTAX },
185185
[PM_ERR_EXPECT_IDENT_REQ_PARAMETER] = { "expected an identifier for the required parameter", PM_ERROR_LEVEL_SYNTAX },
186186
[PM_ERR_EXPECT_IN_DELIMITER] = { "expected a delimiter after the patterns of an `in` clause", PM_ERROR_LEVEL_SYNTAX },
187+
[PM_ERR_EXPECT_LPAREN_AFTER_NOT] = { "expected a `(` after `not`", PM_ERROR_LEVEL_SYNTAX },
187188
[PM_ERR_EXPECT_LPAREN_REQ_PARAMETER] = { "expected a `(` to start a required parameter", PM_ERROR_LEVEL_SYNTAX },
188189
[PM_ERR_EXPECT_MESSAGE] = { "unexpected %s; expecting a message to send to the receiver", PM_ERROR_LEVEL_SYNTAX },
189190
[PM_ERR_EXPECT_RBRACKET] = { "expected a matching `]`", PM_ERROR_LEVEL_SYNTAX },
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
true && not true
2+
^~~~ expected a `(` after `not`
3+
^~~~ unexpected 'true', expecting end-of-input
4+
5+
true || not true
6+
^~~~ expected a `(` after `not`
7+
^~~~ unexpected 'true', expecting end-of-input
8+
9+
true && not (true)
10+
^ expected a `(` after `not`
11+
^ unexpected '(', expecting end-of-input
12+
13+
true && not
14+
true
15+
^~~~ expected a `(` after `not`
16+
^~~~ unexpected 'true', expecting end-of-input
17+

0 commit comments

Comments
 (0)