yield
cannot be placed outside methods even in blocks
This commit is contained in:
parent
63e504d6e6
commit
9059dfce12
2
parse.y
2
parse.y
@ -4349,7 +4349,7 @@ k_return : keyword_return
|
|||||||
|
|
||||||
k_yield : keyword_yield
|
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");
|
yyerror1(&@1, "Invalid yield");
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
@ -89,11 +89,17 @@ module Prism
|
|||||||
src = source
|
src = source
|
||||||
|
|
||||||
case relative
|
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
|
# Uncaught syntax errors: Invalid break, Invalid next
|
||||||
src = "->do\nrescue\n#{src}\nend"
|
src = "->do\nrescue\n#{src}\nend"
|
||||||
ripper_should_match = false
|
ripper_should_match = false
|
||||||
end
|
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
|
# Make sure that it can be correctly parsed by Ripper. If it can't, then we have a fixture
|
||||||
# that is invalid Ruby.
|
# that is invalid Ruby.
|
||||||
|
@ -312,11 +312,13 @@ class TestAst < Test::Unit::TestCase
|
|||||||
assert_invalid_parse(msg, "class C; yield; end")
|
assert_invalid_parse(msg, "class C; yield; end")
|
||||||
assert_invalid_parse(msg, "BEGIN {yield}")
|
assert_invalid_parse(msg, "BEGIN {yield}")
|
||||||
assert_invalid_parse(msg, "END {yield}")
|
assert_invalid_parse(msg, "END {yield}")
|
||||||
|
assert_invalid_parse(msg, "-> {yield}")
|
||||||
|
|
||||||
assert_invalid_parse(msg, "yield true")
|
assert_invalid_parse(msg, "yield true")
|
||||||
assert_invalid_parse(msg, "class C; yield true; end")
|
assert_invalid_parse(msg, "class C; yield true; end")
|
||||||
assert_invalid_parse(msg, "BEGIN {yield true}")
|
assert_invalid_parse(msg, "BEGIN {yield true}")
|
||||||
assert_invalid_parse(msg, "END {yield true}")
|
assert_invalid_parse(msg, "END {yield true}")
|
||||||
|
assert_invalid_parse(msg, "-> {yield true}")
|
||||||
|
|
||||||
assert_parse("!defined?(yield)")
|
assert_parse("!defined?(yield)")
|
||||||
assert_parse("class C; defined?(yield); end")
|
assert_parse("class C; defined?(yield); end")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user