summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--parse.y24
-rw-r--r--test/ruby/test_syntax.rb14
3 files changed, 44 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 747c23edf3..13af8b61c9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Tue Mar 6 01:34:19 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (block_call): rules for block_call after block_call.
+ based on a patch by pasberth https://github.com/ruby/ruby/pull/102
+ [ruby-dev:45308][Bug #6115]
+
Tue Mar 6 01:24:13 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* parse.y (block_command, block_call): simplified rules.
diff --git a/parse.y b/parse.y
index f81819c9e5..4796e7453c 100644
--- a/parse.y
+++ b/parse.y
@@ -3856,6 +3856,30 @@ block_call : command do_block
$$ = method_optarg($$, $4);
%*/
}
+ | block_call dot_or_colon operation2 opt_paren_args brace_block
+ {
+ /*%%%*/
+ block_dup_check($4, $5);
+ $5->nd_iter = NEW_CALL($1, $3, $4);
+ $$ = $5;
+ fixpos($$, $1);
+ /*%
+ $$ = dispatch4(command_call, $1, $2, $3, $4);
+ $$ = method_add_block($$, $5);
+ %*/
+ }
+ | block_call dot_or_colon operation2 command_args do_block
+ {
+ /*%%%*/
+ block_dup_check($4, $5);
+ $5->nd_iter = NEW_CALL($1, $3, $4);
+ $$ = $5;
+ fixpos($$, $1);
+ /*%
+ $$ = dispatch4(command_call, $1, $2, $3, $4);
+ $$ = method_add_block($$, $5);
+ %*/
+ }
;
method_call : operation
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index fde8dca308..f247b4c6dc 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -63,6 +63,20 @@ class TestSyntax < Test::Unit::TestCase
end
end
+ tap do |_,
+ bug6115 = '[ruby-dev:45308]',
+ blockcall = '["elem"].each_with_object [] do end',
+ methods = [['map', 'no'], ['inject([])', 'with']],
+ blocks = [['do end', 'do'], ['{}', 'brace']],
+ *|
+ [%w'. dot', %w':: colon'].product(methods, blocks) do |(c, n1), (m, n2), (b, n3)|
+ m = m.tr_s('()', ' ').strip if n2 == 'do'
+ name = "test_#{n3}_block_after_blockcall_#{n1}_#{n2}_arg"
+ code = "#{blockcall}#{c}#{m} #{b}"
+ define_method(name) {assert_valid_syntax(code, bug6115)}
+ end
+ end
+
private
def make_tmpsrc(f, src)