@@ -41,6 +41,37 @@ def object.[]=(_, _) end
41
41
ScratchPad . recorded . should == [ :rhs ]
42
42
end
43
43
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
44
75
end
45
76
46
77
describe 'using +=' do
@@ -114,6 +145,37 @@ def []=(k, v) @a[k] = v; 42 end
114
145
a . public_method ( :k , 2 ) . should == 2
115
146
end
116
147
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
+
117
179
context 'splatted argument' do
118
180
it 'correctly handles it' do
119
181
@b [ :m ] = 10
0 commit comments