aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--parse.y18
-rw-r--r--test/ruby/test_parse.rb6
2 files changed, 16 insertions, 8 deletions
diff --git a/parse.y b/parse.y
index adae297678..833eda062c 100644
--- a/parse.y
+++ b/parse.y
@@ -5074,14 +5074,16 @@ parser_yyerror(struct parser_params *parser, const char *msg)
buf = ALLOCA_N(char, i+2);
code = p;
caret = p2 = buf;
- i = (int)(parser->tokp - p);
- while (i-- > 0) {
- *p2++ = *p++ == '\t' ? '\t' : ' ';
- }
- *p2++ = '^';
- if (lex_p > parser->tokp + 1) {
- memset(p2, '~', (lex_p - parser->tokp) - 1);
- p2 += (lex_p - parser->tokp) - 1;
+ if (p <= parser->tokp) {
+ while (p < parser->tokp) {
+ *p2++ = *p++ == '\t' ? '\t' : ' ';
+ }
+ *p2++ = '^';
+ p++;
+ }
+ if (lex_p > p) {
+ memset(p2, '~', (lex_p - p));
+ p2 += (lex_p - p);
}
*p2 = '\0';
newline = "\n";
diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
index 030442f9e9..d2fc5f0721 100644
--- a/test/ruby/test_parse.rb
+++ b/test/ruby/test_parse.rb
@@ -1001,6 +1001,12 @@ x = __ENCODING__
end;
end
+ def test_unexpected_token_error
+ assert_raise(SyntaxError) do
+ eval('"x"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
+ end
+ end
+
=begin
def test_past_scope_variable
assert_warning(/past scope/) {catch {|tag| eval("BEGIN{throw tag}; tap {a = 1}; a")}}