diff --git a/parse.y b/parse.y index bd1717d724..ff00fa8e35 100644 --- a/parse.y +++ b/parse.y @@ -8659,7 +8659,8 @@ parse_percent(struct parser_params *p, const int space_seen, const enum lex_stat c = nextc(p); quotation: - if (c == -1 || !ISALNUM(c)) { + if (c == -1) goto unterminated; + if (!ISALNUM(c)) { term = c; if (!ISASCII(c)) goto unknown; c = 'Q'; @@ -8677,6 +8678,7 @@ parse_percent(struct parser_params *p, const int space_seen, const enum lex_stat } } if (term == -1) { + unterminated: compile_error(p, "unterminated quoted string meets end of file"); return 0; } diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb index 5f638afa01..4b7a12c8ef 100644 --- a/test/ruby/test_parse.rb +++ b/test/ruby/test_parse.rb @@ -601,6 +601,7 @@ class TestParse < Test::Unit::TestCase assert_syntax_error('%z()', /unknown type/) assert_syntax_error("%\u3042", /unknown type/) assert_syntax_error("%q\u3042", /unknown type/) + assert_syntax_error("%", /unterminated quoted string/) end def test_symbol