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 <