aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-08-26 21:36:22 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-08-26 21:36:22 +0900
commit445e5548c9da906a2d7a490e660328b2893d07d1 (patch)
tree981f38dd6b15e576bc1274023ffa645bf489dfe5
parentcc36b5d4aced7c8df0c1933ef3482736de068cfc (diff)
downloadruby-445e5548c9da906a2d7a490e660328b2893d07d1.tar.gz
Fixed error messages at non-ascii %string terminator
-rw-r--r--parse.y6
-rw-r--r--test/ruby/test_parse.rb2
2 files changed, 8 insertions, 0 deletions
diff --git a/parse.y b/parse.y
index 9978fb15d1..4efbd8c6d4 100644
--- a/parse.y
+++ b/parse.y
@@ -8547,11 +8547,17 @@ parse_percent(struct parser_params *p, const int space_seen, const enum lex_stat
quotation:
if (c == -1 || !ISALNUM(c)) {
term = c;
+ if (!ISASCII(c)) goto unknown;
c = 'Q';
}
else {
term = nextc(p);
if (rb_enc_isalnum(term, p->enc) || !parser_isascii(p)) {
+ unknown:
+ pushback(p, term);
+ c = parser_precise_mbclen(p, p->lex.pcur);
+ if (c < 0) return 0;
+ p->lex.pcur += c;
yyerror0("unknown type of %string");
return 0;
}
diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
index 1e909bce1b..422a7cba58 100644
--- a/test/ruby/test_parse.rb
+++ b/test/ruby/test_parse.rb
@@ -599,6 +599,8 @@ class TestParse < Test::Unit::TestCase
assert_syntax_error('%s', /unterminated quoted string/)
assert_syntax_error('%ss', /unknown type/)
assert_syntax_error('%z()', /unknown type/)
+ assert_syntax_error("%\u3042", /unknown type/)
+ assert_syntax_error("%q\u3042", /unknown type/)
end
def test_symbol