Bug #17509
Updated by nobu (Nobuyoshi Nakada) almost 4 years ago
When using `defined?(super)` to check that a superclass method exists before calling `super`, including modules with a custom `respond_to?` method seems to break the check so it wrongfully returns a truthy value, even though the superclass method doesn't exist. This only happens on Ruby 3.0.0 and works fine on previous Ruby versions. This is possibly related to this change: https://github.com/ruby/ruby/pull/3777 ### Example ```ruby ``` module SomeModule def a_method defined?(super) ? super : :no_super_method end end module RespondModule def respond_to?(*) super end end class PlainClass include SomeModule end class ModuleClass include RespondModule include SomeModule end puts "PlainClass: #{PlainClass.new.a_method}" puts "ModuleClass: #{ModuleClass.new.a_method}" ``` ### Actual Result on Ruby 3.0.0p0 ``` PlainClass: no_super_method test.rb:3:in `a_method': super: no superclass method `a_method' for #<ModuleClass:0x00007fd77383f908> (NoMethodError) Did you mean? method from test.rb:24:in `<main>' ``` ### Expected Result (like on older versions) ``` PlainClass: no_super_method ModuleClass: no_super_method ``` Thanks to Rafael França for helping me unravel this.