
Issue #21196 has been updated by tenderlovemaking (Aaron Patterson). Assignee set to tenderlovemaking (Aaron Patterson) Backport changed from 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN to 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: REQUIRED ---------------------------------------- Bug #21196: Ruby 3.4 ignores visibility when passing arguments using `...` https://bugs.ruby-lang.org/issues/21196#change-112410 * Author: toy (Ivan Kuchin) * Status: Open * Assignee: tenderlovemaking (Aaron Patterson) * ruby -v: ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: REQUIRED ---------------------------------------- If method is passing arguments using `...`, then receiver visibility gets ignored if once called without receiver: ```ruby class A private def foo = :foo def bar = :bar end class B def initialize(o) @o = o end def foo(...) = @o.foo(...) def bar = @o.bar def internal_foo = foo def internal_bar = bar end def try p yield rescue => e p e end ``` If `foo` is called first without receiver through `internal_foo`: ```ruby b = B.new(A.new) try{ b.internal_foo } try{ b.internal_bar } try{ b.foo } try{ b.bar } ``` Visibility of `A#foo` gets ignored: ``` ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux] :foo #<NoMethodError: private method 'bar' called for an instance of A> :foo #<NoMethodError: private method 'bar' called for an instance of A> ``` ``` ruby 3.3.7 (2025-01-15 revision be31f993d7) [x86_64-linux] #<NoMethodError: private method `foo' called for an instance of A> #<NoMethodError: private method `bar' called for an instance of A> #<NoMethodError: private method `foo' called for an instance of A> #<NoMethodError: private method `bar' called for an instance of A> ``` If `internal_foo` is not called before `foo`: ```ruby b = B.new(A.new) try{ b.foo } try{ b.bar } ``` Visibility of `A#foo` gets checked: ``` ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux] #<NoMethodError: private method 'foo' called for an instance of A> #<NoMethodError: private method 'bar' called for an instance of A> ``` ``` ruby 3.3.7 (2025-01-15 revision be31f993d7) [x86_64-linux] #<NoMethodError: private method `foo' called for an instance of A> #<NoMethodError: private method `bar' called for an instance of A> ``` -- https://bugs.ruby-lang.org/