diff --git a/parse.y b/parse.y index 3eee213aab..3fa862d56b 100644 --- a/parse.y +++ b/parse.y @@ -1298,7 +1298,12 @@ command_asgn : lhs '=' command_rhs value_expr($6); $3 = make_array($3, &@3); - args = arg_concat(p, $3, $6, &@$); + if (nd_type($3) == NODE_BLOCK_PASS) { + args = NEW_ARGSCAT($3, $6, &@$); + } + else { + args = arg_concat(p, $3, $6, &@$); + } $$ = NEW_OP_ASGN1($1, $5, args, &@$); fixpos($$, $1); /*% diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb index 41aad0050d..e843c66242 100644 --- a/test/ruby/test_parse.rb +++ b/test/ruby/test_parse.rb @@ -457,6 +457,30 @@ class TestParse < Test::Unit::TestCase end end + def test_op_asgn1_with_block + t = Object.new + a = [] + blk = proc {|x| a << x } + def t.[](_) + yield(:aref) + nil + end + def t.[]=(_, _) + yield(:aset) + end + def t.dummy(_) + end + eval <<-END, nil, __FILE__, __LINE__+1 + t[42, &blk] ||= 42 + END + assert_equal([:aref, :aset], a) + a.clear + eval <<-END, nil, __FILE__, __LINE__+1 + t[42, &blk] ||= t.dummy 42 # command_asgn test + END + assert_equal([:aref, :aset], a) + end + def test_backquote t = Object.new