summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-04-29 13:45:32 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-04-29 13:47:20 +0900
commit1432471a759dc0cbc80c53766894dba45e6da887 (patch)
tree200f87a1d197dacdacba52f0e74957bc25268821
parent23375c8b81e07644517e5ad985b2fbf5e1b5d545 (diff)
Disallow also CR in here-doc identifier
* parse.y (heredoc_identifier): CR in here-document identifier might or might not result in a syntax error, by the EOL code. make a syntax error regardless of the EOL code.
-rw-r--r--doc/syntax/literals.rdoc2
-rw-r--r--parse.y2
-rw-r--r--test/ruby/test_syntax.rb6
3 files changed, 8 insertions, 2 deletions
diff --git a/doc/syntax/literals.rdoc b/doc/syntax/literals.rdoc
index 00bc4f89d6..35a2f01ff1 100644
--- a/doc/syntax/literals.rdoc
+++ b/doc/syntax/literals.rdoc
@@ -256,7 +256,7 @@ behaves like Kernel#`:
HEREDOC
When surrounding with quotes, any characters but that quote and newline
-can be used as the identifier.
+(CR and/or LF) can be used as the identifier.
To call a method on a heredoc place it after the opening identifier:
diff --git a/parse.y b/parse.y
index fddd02a9b3..3c52f5b426 100644
--- a/parse.y
+++ b/parse.y
@@ -6820,7 +6820,7 @@ heredoc_identifier(struct parser_params *p)
tokadd(p, func);
term = c;
while ((c = nextc(p)) != -1 && c != term) {
- if (c == '\n') goto unterminated;
+ if (c == '\r' || c == '\n') goto unterminated;
if (tokadd_mbchar(p, c) == -1) return 0;
}
if (c == -1) {
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index 66adeb1c09..771764720b 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -857,6 +857,12 @@ eom
assert_syntax_error("<<\"EOS\n\"\nEOS\n", /unterminated/)
end
+ def test_unterminated_heredoc_cr
+ %W[\r\n \n].each do |nl|
+ assert_syntax_error("<<\"\r\"#{nl}\r#{nl}", /unterminated/, nil, "CR with #{nl.inspect}")
+ end
+ end
+
def test__END___cr
assert_syntax_error("__END__\r<<<<<\n", /unexpected <</)
end