From 3a8a9afc7aa5893ef53c21a1883a21ce3ba1e017 Mon Sep 17 00:00:00 2001 From: Volodymyr Shabanytsia Date: Fri, 4 Jul 2025 20:17:20 +0300 Subject: [PATCH] Add specs for SyntaxError raised when index assignment with block argument --- language/assignments_spec.rb | 62 ++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/language/assignments_spec.rb b/language/assignments_spec.rb index 89a5afdcd8..4ad9f4167b 100644 --- a/language/assignments_spec.rb +++ b/language/assignments_spec.rb @@ -41,6 +41,37 @@ def object.[]=(_, _) end ScratchPad.recorded.should == [:rhs] end end + + context "given block argument" do + before do + @klass = Class.new do + def initialize(h) @h = h end + def [](k, &block) @h[k]; end + def []=(k, v, &block) @h[k] = v; end + end + end + + ruby_version_is ""..."3.4" do + it "accepts block argument" do + obj = @klass.new(a: 1) + block = proc {} + + eval "obj[:a, &block] = 2" + eval("obj[:a, &block]").should == 2 + end + end + + ruby_version_is "3.4" do + it "raises SyntaxError" do + obj = @klass.new(a: 1) + block = proc {} + + -> { + eval "obj[:a, &block] = 2" + }.should raise_error(SyntaxError, /unexpected block arg given in index assignment|block arg given in index assignment/) + end + end + end end describe 'using +=' do @@ -114,6 +145,37 @@ def []=(k, v) @a[k] = v; 42 end a.public_method(:k, 2).should == 2 end + context "given block argument" do + before do + @klass = Class.new do + def initialize(h) @h = h end + def [](k, &block) @h[k]; end + def []=(k, v, &block) @h[k] = v; end + end + end + + ruby_version_is ""..."3.4" do + it "accepts block argument" do + obj = @klass.new(a: 1) + block = proc {} + + eval "obj[:a, &block] += 2" + eval("obj[:a, &block]").should == 3 + end + end + + ruby_version_is "3.4" do + it "raises SyntaxError" do + obj = @klass.new(a: 1) + block = proc {} + + -> { + eval "obj[:a, &block] += 2" + }.should raise_error(SyntaxError, /unexpected block arg given in index assignment|block arg given in index assignment/) + end + end + end + context 'splatted argument' do it 'correctly handles it' do @b[:m] = 10