Skip to content

Commit

Permalink
Showing 2 changed files with 45 additions and 2 deletions.
43 changes: 43 additions & 0 deletions spec/compiler/codegen/class_spec.cr
Original file line number Diff line number Diff line change
@@ -745,4 +745,47 @@ describe "Code gen: class" do
foo.x
)).to_i.should eq(42)
end

it "codegens virtual metaclass union bug (#2597)" do
run(%(
class Foo
def self.foo
1
end
end
class Foo1 < Foo
def self.foo
2
end
end
class Foo2 < Foo
def self.foo
3
end
end
class Bar
@foo : Foo.class
def initialize
@foo = if 1 == 1
Foo1
elsif 1 == 2
Foo2
else
Foo
end
end
def foo
@foo
end
end
Bar.new.foo.foo
)).to_i.should eq(2)
end
end
4 changes: 2 additions & 2 deletions src/compiler/crystal/semantic/type_merge.cr
Original file line number Diff line number Diff line change
@@ -222,7 +222,7 @@ module Crystal
end

class MetaclassType
def common_ancestor(other : MetaclassType)
def common_ancestor(other : MetaclassType | VirtualMetaclassType)
if instance_type.module? || other.instance_type.module?
nil
else
@@ -245,7 +245,7 @@ module Crystal
end

class VirtualMetaclassType
def common_ancestor(other)
def common_ancestor(other : MetaclassType | VirtualMetaclassType)
common = instance_type.base_type.metaclass.common_ancestor(other)
common.try &.virtual_type!
end

0 comments on commit 380d4ea

Please sign in to comment.