summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parse.y2
-rw-r--r--test/ripper/test_scanner_events.rb10
-rw-r--r--test/ruby/test_parse.rb2
3 files changed, 12 insertions, 2 deletions
diff --git a/parse.y b/parse.y
index 58b8714d95..311bbba80b 100644
--- a/parse.y
+++ b/parse.y
@@ -6133,8 +6133,8 @@ tok_hex(struct parser_params *p, size_t *numlen)
c = scan_hex(p->lex.pcur, 2, numlen);
if (!*numlen) {
- p->lex.ptok = p->lex.pcur;
yyerror0("invalid hex escape");
+ token_flush(p);
return 0;
}
p->lex.pcur += *numlen;
diff --git a/test/ripper/test_scanner_events.rb b/test/ripper/test_scanner_events.rb
index 0b4814a73e..339a66d5ec 100644
--- a/test/ripper/test_scanner_events.rb
+++ b/test/ripper/test_scanner_events.rb
@@ -976,4 +976,14 @@ class TestRipper::ScannerEvents < Test::Unit::TestCase
assert_match /Invalid char/, err[1]
assert_equal "\e", err[2]
end
+
+ def test_invalid_hex_escape
+ err = nil
+ assert_equal ['U'], scan('tstring_content', '"\\xU"') {|*e| err = e}
+ assert_equal [:on_parse_error, "invalid hex escape", "\\x"], err
+
+ err = nil
+ assert_equal ['U'], scan('tstring_content', '/\\xU/') {|*e| err = e}
+ assert_equal [:on_parse_error, "invalid hex escape", "\\x"], err
+ end
end if ripper_test
diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
index fca8d7484a..ff62aef785 100644
--- a/test/ruby/test_parse.rb
+++ b/test/ruby/test_parse.rb
@@ -513,7 +513,7 @@ class TestParse < Test::Unit::TestCase
mesg = 'from the backslash through the invalid char'
e = assert_syntax_error('"\xg1"', /hex escape/)
- assert_equal(' ^', e.message.lines.last, mesg)
+ assert_equal(' ^~', e.message.lines.last, mesg)
e = assert_syntax_error('"\u{1234"', 'unterminated Unicode escape')
assert_equal(' ^', e.message.lines.last, mesg)