aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-10-02 22:06:32 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-10-02 23:20:03 +0900
commit9059dfce12995451a4374330baab49177fa717be (patch)
tree2c31bbba49d44a5ffe6914044c6a5be2f021b722
parent63e504d6e65765740a592ee785147e5eff0d9aed (diff)
downloadruby-9059dfce12995451a4374330baab49177fa717be.tar.gz
`yield` cannot be placed outside methods even in blocks
-rw-r--r--parse.y2
-rw-r--r--test/prism/parse_test.rb8
-rw-r--r--test/ruby/test_ast.rb2
3 files changed, 10 insertions, 2 deletions
diff --git a/parse.y b/parse.y
index 81f27e91f4..b8bc94cf7c 100644
--- a/parse.y
+++ b/parse.y
@@ -4349,7 +4349,7 @@ k_return : keyword_return
k_yield : keyword_yield
{
- if (!p->ctxt.in_defined && !p->ctxt.in_def && !dyna_in_block(p))
+ if (!p->ctxt.in_defined && !p->ctxt.in_def && !compile_for_eval)
yyerror1(&@1, "Invalid yield");
}
;
diff --git a/test/prism/parse_test.rb b/test/prism/parse_test.rb
index 3c0d584a12..aed41b5f84 100644
--- a/test/prism/parse_test.rb
+++ b/test/prism/parse_test.rb
@@ -89,11 +89,17 @@ module Prism
src = source
case relative
- when /break|next|redo|if|unless|rescue|control|keywords|retry|yield|\/args_assocs/
+ when /break|next|redo|if|unless|rescue|control|keywords|retry/
# Uncaught syntax errors: Invalid break, Invalid next
src = "->do\nrescue\n#{src}\nend"
ripper_should_match = false
end
+ case src
+ when /^ *yield/
+ # Uncaught syntax errors: Invalid yield
+ src = "def __invalid_yield__\n#{src}\nend"
+ ripper_should_match = false
+ end
# Make sure that it can be correctly parsed by Ripper. If it can't, then we have a fixture
# that is invalid Ruby.
diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb
index f2c746aafa..c8617d50f0 100644
--- a/test/ruby/test_ast.rb
+++ b/test/ruby/test_ast.rb
@@ -312,11 +312,13 @@ class TestAst < Test::Unit::TestCase
assert_invalid_parse(msg, "class C; yield; end")
assert_invalid_parse(msg, "BEGIN {yield}")
assert_invalid_parse(msg, "END {yield}")
+ assert_invalid_parse(msg, "-> {yield}")
assert_invalid_parse(msg, "yield true")
assert_invalid_parse(msg, "class C; yield true; end")
assert_invalid_parse(msg, "BEGIN {yield true}")
assert_invalid_parse(msg, "END {yield true}")
+ assert_invalid_parse(msg, "-> {yield true}")
assert_parse("!defined?(yield)")
assert_parse("class C; defined?(yield); end")