Project

General

Profile

Bug #17007

SystemStackError when using super inside Module included and lexically inside refinement

Added by Eregon (Benoit Daloze) 5 months ago. Updated 2 months ago.

Status:
Assigned
Priority:
Normal
Target version:
-
ruby -v:
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
[ruby-core:99044]

Description

class C
  def foo
    ["C"]
  end
end

refinement = Module.new do
  R = refine C do
    def foo
      ["R"] + super
    end

    include Module.new {
      def foo
        ["M"] + super
      end
    }
  end
end

using refinement
p C.new.foo

gives

$ ruby bug_refine_super.rb
Traceback (most recent call last):
    10920: from bug_refine_super.rb:22:in `<main>'
    10919: from bug_refine_super.rb:10:in `foo'
    10918: from bug_refine_super.rb:15:in `foo'
    10917: from bug_refine_super.rb:10:in `foo'
    10916: from bug_refine_super.rb:15:in `foo'
    10915: from bug_refine_super.rb:10:in `foo'
    10914: from bug_refine_super.rb:15:in `foo'
    10913: from bug_refine_super.rb:10:in `foo'
     ... 10908 levels...
        4: from bug_refine_super.rb:15:in `foo'
        3: from bug_refine_super.rb:10:in `foo'
        2: from bug_refine_super.rb:15:in `foo'
        1: from bug_refine_super.rb:10:in `foo'
bug_refine_super.rb:15:in `foo': stack level too deep (SystemStackError)

OTOH defining the module lexically outside of refine works:

m = Module.new {
  def foo
    ["M"] + super
  end
}
refinement = Module.new do
  R = refine C do
    def foo
      ["R"] + super
    end

    include m
  end
end

# result: ["R", "M", "C"]

Related issues

Related to Ruby master - Bug #16977: Ambiguous lookup super for refinementsClosedActions

Also available in: Atom PDF