From: merch-redmine@... Date: 2019-10-02T22:33:34+00:00 Subject: [ruby-core:95193] [Ruby master Bug#16100] Visibility modifiers don't call super correctly when overridden in alternative ways Issue #16100 has been updated by jeremyevans0 (Jeremy Evans). Status changed from Open to Closed prebsch (Patrick Rebsch) wrote: > The source code makes it clear that the argument-less version is dependent upon a scope. So if I understand you correctly, the call to `super` in `Parent` is what would be calling this, and since that is in the scope of `Parent`, the originating call from `Child_1` doesn't work because the scope doesn't match? Sorry for taking a long time to respond. Yes, the `Child1.private` call sets the `private` scope visibility in the `Parent` scope, because that is the current scope when `super` is called in `Parent.private`. I'm going to close this now, as I don't think this behavior is a bug. ---------------------------------------- Bug #16100: Visibility modifiers don't call super correctly when overridden in alternative ways https://bugs.ruby-lang.org/issues/16100#change-81868 * Author: prebsch (Patrick Rebsch) * Status: Closed * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.7.0dev (2019-08-14) [x86_64-darwin18] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN ---------------------------------------- It seems that the method visibility modifiers don't call `super` correctly when they are overridden in certain ways. I expected the following examples to all behave the same since they are all being defined on the singleton class, but only the first operates correctly presumably because it is explicitly defined on the singleton class. I've reproduced this behavior with `2.7.0`, `2.6.3`, and `2.5.5`. ``` ruby def test_visibility(description, klass) puts "Case: #{ description }" puts " #=> #{ klass.private_instance_methods.include?(:private_method) }" puts end test_visibility('explicit', Class.new { def self.private(*); super; end private; def private_method; end }) test_visibility('opened singleton', Class.new { class << self def private(*); super; end end private; def private_method; end }) test_visibility('include/prepend to singleton', Class.new { module M def private(*); super; end end singleton_class.prepend(M) private; def private_method; end }) ``` ``` Case: explicit #=> true Case: opened singleton #=> false Case: include/prepend to singleton #=> false ``` -- https://bugs.ruby-lang.org/ Unsubscribe: