diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2023-10-02 22:06:32 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2023-10-02 23:20:03 +0900 |
commit | 9059dfce12995451a4374330baab49177fa717be (patch) | |
tree | 2c31bbba49d44a5ffe6914044c6a5be2f021b722 | |
parent | 63e504d6e65765740a592ee785147e5eff0d9aed (diff) | |
download | ruby-9059dfce12995451a4374330baab49177fa717be.tar.gz |
`yield` cannot be placed outside methods even in blocks
-rw-r--r-- | parse.y | 2 | ||||
-rw-r--r-- | test/prism/parse_test.rb | 8 | ||||
-rw-r--r-- | test/ruby/test_ast.rb | 2 |
3 files changed, 10 insertions, 2 deletions
@@ -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") |