From 9059dfce12995451a4374330baab49177fa717be Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 2 Oct 2023 22:06:32 +0900 Subject: `yield` cannot be placed outside methods even in blocks --- parse.y | 2 +- test/prism/parse_test.rb | 8 +++++++- test/ruby/test_ast.rb | 2 ++ 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") -- cgit v1.2.3