[ruby-core:121429] [Ruby Bug#21196] Ruby 3.4 ignores visibility when passing arguments using `...`
From:
"toy (Ivan Kuchin) via ruby-core" <ruby-core@...>
Date:
2025-03-21 14:47:28 UTC
List:
ruby-core #121429
Issue #21196 has been reported by toy (Ivan Kuchin).
----------------------------------------
Bug #21196: Ruby 3.4 ignores visibility when passing arguments using `...`
https://bugs.ruby-lang.org/issues/21196
* Author: toy (Ivan Kuchin)
* Status: Open
* 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: UNKNOWN
----------------------------------------
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/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/