summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Dalessio <mike.dalessio@gmail.com>2023-08-17 16:44:43 -0400
committergit <svn-admin@ruby-lang.org>2023-08-18 12:51:14 +0000
commit2800d1fd370e267d4379a4029a7d6e799387cd97 (patch)
tree549069ba48e7cb6f8ff81944b2641ab916dfe6f4
parent20106fe2274a88b8bea5413e3d7e9534f595d8a7 (diff)
[ruby/yarp] fix: unterminated % in arguments
https://github.com/ruby/yarp/commit/efb3102369
-rw-r--r--test/yarp/errors_test.rb7
-rw-r--r--yarp/yarp.c12
2 files changed, 12 insertions, 7 deletions
diff --git a/test/yarp/errors_test.rb b/test/yarp/errors_test.rb
index 3b880eda85..355e7a8aff 100644
--- a/test/yarp/errors_test.rb
+++ b/test/yarp/errors_test.rb
@@ -155,6 +155,13 @@ class ErrorsTest < Test::Unit::TestCase
]
end
+ def test_unterminated_argument_expression
+ assert_errors expression('a %'), 'a %', [
+ ["Unexpected end of input", 2..3],
+ ["Expected a value after the operator.", 3..3],
+ ]
+ end
+
def test_1_2_3
assert_errors expression("(1, 2, 3)"), "(1, 2, 3)", [
["Expected to be able to parse an expression.", 2..2],
diff --git a/yarp/yarp.c b/yarp/yarp.c
index 6740254130..ed777a4520 100644
--- a/yarp/yarp.c
+++ b/yarp/yarp.c
@@ -6494,13 +6494,11 @@ parser_lex(yp_parser_t *parser) {
// % %= %i %I %q %Q %w %W
case '%': {
- // In a BEG state, if you encounter a % then you must be
- // starting something. In this case if there is no
- // subsequent character then we have an invalid token. We're
- // going to say it's the percent operator because we don't
- // want to move into the string lex mode unnecessarily.
- if (lex_state_beg_p(parser) && (parser->current.end >= parser->end)) {
- yp_diagnostic_list_append(&parser->error_list, parser->current.start, parser->current.end, "unexpected end of input");
+ // If there is no subsequent character then we have an invalid token. We're
+ // going to say it's the percent operator because we don't want to move into the
+ // string lex mode unnecessarily.
+ if ((lex_state_beg_p(parser) || lex_state_arg_p(parser)) && (parser->current.end >= parser->end)) {
+ yp_diagnostic_list_append(&parser->error_list, parser->current.start, parser->current.end, "Unexpected end of input");
LEX(YP_TOKEN_PERCENT);
}