diff --git a/prism_compile.c b/prism_compile.c index be47806fbd..8c4f0fed0a 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -2711,7 +2711,12 @@ pm_compile_call(rb_iseq_t *iseq, const pm_call_node_t *call_node, LINK_ANCHOR *c } if (pm_node->flags & PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) { - if (flags & VM_CALL_ARGS_SPLAT) { + if (flags & VM_CALL_ARGS_BLOCKARG) { + ADD_INSN1(ret, &dummy_line_node, topn, INT2FIX(1)); + ADD_INSN1(ret, &dummy_line_node, setn, INT2FIX(orig_argc + 3)); + PM_POP; + } + else if (flags & VM_CALL_ARGS_SPLAT) { ADD_INSN(ret, &dummy_line_node, dup); ADD_INSN1(ret, &dummy_line_node, putobject, INT2FIX(-1)); ADD_SEND_WITH_FLAG(ret, &dummy_line_node, idAREF, INT2FIX(1), INT2FIX(0)); diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index 29f0530462..7705959f4c 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -1762,6 +1762,15 @@ end obj[*[1]] = 3 RUBY + # Test passing block inside of []= + assert_prism_eval(<<~RUBY) + obj = Object.new + def obj.[]=(a); end + + p = proc {} + obj[&p] = 4 + RUBY + assert_prism_eval(<<-CODE) def self.prism_opt_var_trail_hash(a = nil, *b, c, **d); end prism_opt_var_trail_hash("a")