diff --git a/spec/compiler/codegen/struct_spec.cr b/spec/compiler/codegen/struct_spec.cr index 04b7391efc1e9c4a7938d7bdee79f3c5a84b57fe..cf8ec57b21ac3acf8b74c7839dcc464d37d7c7c4 100644 --- a/spec/compiler/codegen/struct_spec.cr +++ b/spec/compiler/codegen/struct_spec.cr @@ -276,4 +276,24 @@ describe "Code gen: struct" do g.x ").to_i.should eq(2) end + + it "does phi of struct" do + run(" + struct Foo + def initialize(@x) + end + + def x + @x + end + end + + x = if 1 == 2 + Foo.new(2) + else + Foo.new(1) + end + x.x + ").to_i.should eq(1) + end end diff --git a/src/compiler/crystal/codegen.cr b/src/compiler/crystal/codegen.cr index 6569c58eb1b6370dccea1a46a32f0b73de665c3b..ddde08c62373bc3071ae6a183d63f42f787c2ffd 100644 --- a/src/compiler/crystal/codegen.cr +++ b/src/compiler/crystal/codegen.cr @@ -1053,7 +1053,7 @@ module Crystal end def add_value(block, type, value) - @codegen.assign_to_union(@union_ptr, @node.type, type, value) + @codegen.codegen_assign(@union_ptr, @node.type, type, value) @count += 1 end @@ -1096,7 +1096,7 @@ module Crystal def new_branched_block(node) exit_block = new_block("exit") node_type = node.type? - if node_type && node_type.union? + if node_type && (node_type.union? || node_type.struct_like?) UnionBranchedBlock.new node, exit_block, self else PhiBranchedBlock.new node, exit_block, self