aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--parse.y3
-rw-r--r--test/ruby/test_syntax.rb5
3 files changed, 13 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 22a59c767a..4e3d016cf1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri May 11 14:23:11 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (primary): begin/end block should be isolated from outside.
+ [ruby-dev:45631][Bug #6419]
+
Fri May 11 14:09:47 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/bigdecimal/bigdecimal.c (PUSH): to prevent VALUE from GC,
diff --git a/parse.y b/parse.y
index 7dd3a8a159..098e946abd 100644
--- a/parse.y
+++ b/parse.y
@@ -2684,6 +2684,8 @@ primary : literal
}
| k_begin
{
+ $<val>1 = cmdarg_stack;
+ cmdarg_stack = 0;
/*%%%*/
$<num>$ = ruby_sourceline;
/*%
@@ -2692,6 +2694,7 @@ primary : literal
bodystmt
k_end
{
+ cmdarg_stack = $<val>1;
/*%%%*/
if ($3 == NULL) {
$$ = NEW_NIL();
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index 112ad6d052..b792858090 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -171,6 +171,11 @@ class TestSyntax < Test::Unit::TestCase
assert_valid_syntax("-> (x, y) {}", __FILE__, feature6390)
end
+ def test_do_block_in_cmdarg_begin
+ bug6419 = '[ruby-dev:45631]'
+ assert_valid_syntax("p begin 1.times do 1 end end", __FILE__, bug6419)
+ end
+
private
def not_label(x) @result = x; @not_label ||= nil end