aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--parse.y6
-rw-r--r--test/ruby/test_syntax.rb8
3 files changed, 18 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 1526d1150c..054e47da34 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Aug 12 15:59:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_whole_match_p): treat CR in middle of a line as a
+ mere whitespace.
+
Mon Aug 12 15:16:58 2013 Koichi Sasada <ko1@atdot.net>
* class.c (rb_prepend_module): make T_ICLASS object shady because
diff --git a/parse.y b/parse.y
index 060691f7b7..f325733e66 100644
--- a/parse.y
+++ b/parse.y
@@ -6375,7 +6375,11 @@ parser_whole_match_p(struct parser_params *parser,
while (*p && ISSPACE(*p)) p++;
}
n = lex_pend - (p + len);
- if (n < 0 || (n > 0 && p[len] != '\n' && p[len] != '\r')) return FALSE;
+ if (n < 0) return FALSE;
+ if (n > 0 && p[len] != '\n') {
+ if (p[len] != '\r') return FALSE;
+ if (n <= 1 || p[len+1] != '\n') return FALSE;
+ }
return strncmp(eos, p, len) == 0;
}
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index 99470691ef..f5ff8a7810 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -377,6 +377,14 @@ eom
EOS
end
+ def test_heredoc_cr
+ assert_syntax_error("puts <<""EOS\n""ng\n""EOS\r""NO\n", /can't find string "EOS" anywhere before EOF/)
+ end
+
+ def test__END___cr
+ assert_syntax_error("__END__\r<<<<<\n", /unexpected <</)
+ end
+
private
def not_label(x) @result = x; @not_label ||= nil end