// RUN: %target-swift-frontend -emit-sil -verify %s sil_stage canonical import Swift indirect enum TreeA { case Nil case Leaf(T) case Branch(left: TreeA, right: TreeA) } enum TreeB { case Nil case Leaf(T) indirect case Branch(left: TreeB, right: TreeB) } enum TreeInt { case Nil case Leaf(Int) indirect case Branch(left: TreeInt, right: TreeInt) } sil @indirect_enum : $@convention(thin) (@owned TreeA) -> () { entry(%e : $TreeA): %a = unchecked_enum_data %e : $TreeA, #TreeA.Leaf!enumelt %b = project_box %a : $<τ_0_0> { var τ_0_0 } , 0 %c = unchecked_enum_data %e : $TreeA, #TreeA.Branch!enumelt %d = project_box %c : $<τ_0_0> { var (left: TreeA<τ_0_0>, right: TreeA<τ_0_0>) } , 0 return undef : $() } sil @indirect_enum_case_addr_only : $@convention(thin) (@in TreeB) -> () { entry(%e : $*TreeB): %a = unchecked_take_enum_data_addr %e : $*TreeB, #TreeB.Leaf!enumelt destroy_addr %a : $*T %c = unchecked_take_enum_data_addr %e : $*TreeB, #TreeB.Branch!enumelt %d = load %c : $*<τ_0_0> { var (left: TreeB<τ_0_0>, right: TreeB<τ_0_0>) } return undef : $() } sil @indirect_enum_case_loadable : $@convention(thin) (@owned TreeInt) -> () { entry(%e : $TreeInt): %a = unchecked_enum_data %e : $TreeInt, #TreeInt.Leaf!enumelt store %a to undef : $*Int %c = unchecked_enum_data %e : $TreeInt, #TreeInt.Branch!enumelt %d = project_box %c : ${ var (left: TreeInt, right: TreeInt) }, 0 return undef : $() }