Skip to content

Commit 3b7892b

Browse files
committed
Fix a bug in rb_include_module that stops nested inclusion into module subclasses
This bug was present since the code was originally added by me in 3556a83. Fixes [Bug #20871]
1 parent 9db056f commit 3b7892b

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

class.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1204,8 +1204,8 @@ rb_include_module(VALUE klass, VALUE module)
12041204
iclass = iclass->next;
12051205
}
12061206

1207-
int do_include = 1;
12081207
while (iclass) {
1208+
int do_include = 1;
12091209
VALUE check_class = iclass->klass;
12101210
/* During lazy sweeping, iclass->klass could be a dead object that
12111211
* has not yet been swept. */

test/ruby/test_module.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,18 @@ def test_prepend_after_include
784784
assert_equal([:m1, :m0, :m, :sc, :m1, :m0, :c], sc.new.m)
785785
end
786786

787+
def test_include_into_module_after_prepend_bug_20871
788+
bar = Module.new{def bar; 'bar'; end}
789+
foo = Module.new{def foo; 'foo'; end}
790+
m = Module.new
791+
c = Class.new{include m}
792+
m.prepend bar
793+
Class.new{include m}
794+
m.include foo
795+
assert_include c.ancestors, foo
796+
assert_equal "foo", c.new.foo
797+
end
798+
787799
def test_protected_include_into_included_module
788800
m1 = Module.new do
789801
def other_foo(other)

0 commit comments

Comments
 (0)