summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-06-20 20:10:46 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-06-20 20:10:46 +0900
commit6be402e172a537000de58a28af389cb55dd62ec8 (patch)
tree15af6549774ce5d977bbedccfa58cbdd4d72bb94
parent49b83b73ef380afac78e9495e52000509119a471 (diff)
[Bug #19736] Recover after unterminated interpolation
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/7963
-rw-r--r--parse.y6
-rw-r--r--test/ripper/test_lexer.rb9
-rw-r--r--test/ruby/test_parse.rb9
3 files changed, 23 insertions, 1 deletions
diff --git a/parse.y b/parse.y
index 616b2fe4f4..76386e47ed 100644
--- a/parse.y
+++ b/parse.y
@@ -5331,7 +5331,7 @@ string_content : tSTRING_CONTENT
$<num>$ = p->heredoc_indent;
p->heredoc_indent = 0;
}
- compstmt tSTRING_DEND
+ compstmt string_dend
{
COND_POP();
CMDARG_POP();
@@ -5348,6 +5348,10 @@ string_content : tSTRING_CONTENT
}
;
+string_dend : tSTRING_DEND
+ | END_OF_INPUT
+ ;
+
string_dvar : tGVAR
{
/*%%%*/
diff --git a/test/ripper/test_lexer.rb b/test/ripper/test_lexer.rb
index 8e8a616627..92587ae4c0 100644
--- a/test/ripper/test_lexer.rb
+++ b/test/ripper/test_lexer.rb
@@ -264,4 +264,13 @@ world"
CODE
assert_equal(code, Ripper.tokenize(code).join(""), bug)
end
+
+ def test_heredoc_unterminated_interpolation
+ code = <<~'HEREDOC'
+ <<A+1
+ #{
+ HEREDOC
+
+ assert_include(Ripper.tokenize(code).join(""), "+1")
+ end
end
diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
index 71507575a7..099050dc8d 100644
--- a/test/ruby/test_parse.rb
+++ b/test/ruby/test_parse.rb
@@ -1121,6 +1121,15 @@ x = __ENCODING__
assert_equal v1, v3
end
+ def test_heredoc_unterminated_interpolation
+ code = <<~'HEREDOC'
+ <<A+1
+ #{
+ HEREDOC
+
+ assert_syntax_error(code, /can't find string "A"/)
+ end
+
def test_unexpected_token_error
assert_syntax_error('"x"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', /unexpected/)
end