@@ -41,6 +41,37 @@ def object.[]=(_, _) end
4141 ScratchPad . recorded . should == [ :rhs ]
4242 end
4343 end
44+
45+ context "given block argument" do
46+ before do
47+ @klass = Class . new do
48+ def initialize ( h ) @h = h end
49+ def []( k , &block ) @h [ k ] ; end
50+ def []=( k , v , &block ) @h [ k ] = v ; end
51+ end
52+ end
53+
54+ ruby_version_is "" ..."3.4" do
55+ it "accepts block argument" do
56+ obj = @klass . new ( a : 1 )
57+ block = proc { }
58+
59+ eval "obj[:a, &block] = 2"
60+ eval ( "obj[:a, &block]" ) . should == 2
61+ end
62+ end
63+
64+ ruby_version_is "3.4" do
65+ it "raises SyntaxError" do
66+ obj = @klass . new ( a : 1 )
67+ block = proc { }
68+
69+ -> {
70+ eval "obj[:a, &block] = 2"
71+ } . should raise_error ( SyntaxError , /unexpected block arg given in index assignment|block arg given in index assignment/ )
72+ end
73+ end
74+ end
4475 end
4576
4677 describe 'using +=' do
@@ -114,6 +145,37 @@ def []=(k, v) @a[k] = v; 42 end
114145 a . public_method ( :k , 2 ) . should == 2
115146 end
116147
148+ context "given block argument" do
149+ before do
150+ @klass = Class . new do
151+ def initialize ( h ) @h = h end
152+ def []( k , &block ) @h [ k ] ; end
153+ def []=( k , v , &block ) @h [ k ] = v ; end
154+ end
155+ end
156+
157+ ruby_version_is "" ..."3.4" do
158+ it "accepts block argument" do
159+ obj = @klass . new ( a : 1 )
160+ block = proc { }
161+
162+ eval "obj[:a, &block] += 2"
163+ eval ( "obj[:a, &block]" ) . should == 3
164+ end
165+ end
166+
167+ ruby_version_is "3.4" do
168+ it "raises SyntaxError" do
169+ obj = @klass . new ( a : 1 )
170+ block = proc { }
171+
172+ -> {
173+ eval "obj[:a, &block] += 2"
174+ } . should raise_error ( SyntaxError , /unexpected block arg given in index assignment|block arg given in index assignment/ )
175+ end
176+ end
177+ end
178+
117179 context 'splatted argument' do
118180 it 'correctly handles it' do
119181 @b [ :m ] = 10
0 commit comments