// RUN: %target-sil-opt -module-name Swift -enable-sil-ownership -enable-sil-verify-all=0 -o /dev/null 2>&1 %s
// REQUIRES: asserts

sil_stage raw

import Builtin

enum Optional<T> {
case some(T)
case none
}

struct Bool {
  var value: Builtin.Int1
}

// This file is meant to contain tests that previously the verifier treated
// incorrectly. This is important to ensure that the verifier does not
// regress. It should only deal with use matching in a DI context.
//
// *NOTE* This was originally a test file for definite_init.sil that looked
// interesting from an ownership perspective. So I took it and reused it to get
// coverage here.

sil @takes_Int_inout : $@convention(thin) (@inout Builtin.Int32) -> ()
sil @makesInt : $@convention(thin) () -> Builtin.Int32

// func used_by_inout(a : Builtin.Int32) -> (Builtin.Int32, Builtin.Int32) {
//  var t = a
//  takes_Int_inout(&a)
//  return (t, a)
//}
sil [ossa] @used_by_inout : $@convention(thin) (Builtin.Int32) -> (Builtin.Int32, Builtin.Int32) {
bb0(%0 : $Builtin.Int32):
  %91 = alloc_box $<τ_0_0> { var τ_0_0 } <Builtin.Int32>
  %91a = project_box %91 : $<τ_0_0> { var τ_0_0 } <Builtin.Int32>, 0
  %1 = mark_uninitialized [var] %91a : $*Builtin.Int32
  store %0 to [trivial] %1 : $*Builtin.Int32
  %3 = load [trivial] %1 : $*Builtin.Int32
  %5 = function_ref @takes_Int_inout : $@convention(thin) (@inout Builtin.Int32) -> ()
  %6 = apply %5(%1) : $@convention(thin) (@inout Builtin.Int32) -> ()
  %7 = load [trivial] %1 : $*Builtin.Int32
  %8 = tuple (%3 : $Builtin.Int32, %7 : $Builtin.Int32)
  destroy_value %91 : $<τ_0_0> { var τ_0_0 } <Builtin.Int32>
  return %8 : $(Builtin.Int32, Builtin.Int32)
}

struct AddressOnlyStruct {
  var a : Any
  var b : Builtin.Int32
}

/// returns_generic_struct - This returns a struct by reference.
sil @returns_generic_struct : $@convention(thin) () -> @out AddressOnlyStruct

// There should be no error in this function.
sil [ossa] @call_struct_return_function : $@convention(thin) () -> Builtin.Int32 {
bb0:
  %0 = alloc_box $<τ_0_0> { var τ_0_0 } <AddressOnlyStruct>
  %0a = project_box %0 : $<τ_0_0> { var τ_0_0 } <AddressOnlyStruct>, 0
  %1 = mark_uninitialized [var] %0a : $*AddressOnlyStruct
  %2 = function_ref @returns_generic_struct : $@convention(thin) () -> @out AddressOnlyStruct
  %3 = apply %2(%1) : $@convention(thin) () -> @out AddressOnlyStruct
  %4 = struct_element_addr %1 : $*AddressOnlyStruct, #AddressOnlyStruct.b
  %5 = load [trivial] %4 : $*Builtin.Int32
  destroy_value %0 : $<τ_0_0> { var τ_0_0 } <AddressOnlyStruct>
  return %5 : $Builtin.Int32
}

sil [ossa] @copy_addr1 : $@convention(thin) <T> (@in T) -> @out T {
bb0(%0 : $*T, %1 : $*T):
  %3 = alloc_box $<τ_0_0> { var τ_0_0 } <T>
  %3a = project_box %3 : $<τ_0_0> { var τ_0_0 } <T>, 0
  %4 = mark_uninitialized [var] %3a : $*T
  copy_addr [take] %1 to [initialization] %4 : $*T
  copy_addr %4 to [initialization] %0 : $*T
  destroy_value %3 : $<τ_0_0> { var τ_0_0 } <T>
  %9 = tuple ()
  return %9 : $()
}

class SomeClass {}

sil @getSomeClass : $@convention(thin) () -> @owned SomeClass
sil @getSomeOptionalClass : $@convention(thin) () -> Optional<SomeClass>

sil [ossa] @assign_test_trivial : $@convention(thin) (Builtin.Int32) -> Builtin.Int32 {
bb0(%0 : $Builtin.Int32):
  %7 = alloc_box $<τ_0_0> { var τ_0_0 } <Builtin.Int32>
  %7a = project_box %7 : $<τ_0_0> { var τ_0_0 } <Builtin.Int32>, 0
  %1 = mark_uninitialized [var] %7a : $*Builtin.Int32

  // These assigns are a mix of init + store forms, but because Int is trivial,
  // they all turn into stores.
  assign %0 to %1 : $*Builtin.Int32
  assign %0 to %1 : $*Builtin.Int32
  assign %0 to %1 : $*Builtin.Int32

  %2 = load [trivial] %1 : $*Builtin.Int32
  destroy_value %7 : $<τ_0_0> { var τ_0_0 } <Builtin.Int32>

  return %2 : $Builtin.Int32
}

sil [ossa] @assign_test_nontrivial : $@convention(thin) () -> () {
bb0:
  // Assignments of nontrivial types.  The first becomes an initialize (i.e.,
  // lone store), the second becomes an assignment (retain/release dance).

  %b = alloc_box $<τ_0_0> { var τ_0_0 } <SomeClass>
  %ba = project_box %b : $<τ_0_0> { var τ_0_0 } <SomeClass>, 0
  %c = mark_uninitialized [var] %ba : $*SomeClass
  %f = function_ref @getSomeClass : $@convention(thin) () -> @owned SomeClass
  %4 = apply %f() : $@convention(thin) () -> @owned SomeClass
  assign %4 to %c : $*SomeClass
  %8 = apply %f() : $@convention(thin) () -> @owned SomeClass
  assign %8 to %c : $*SomeClass
  destroy_addr %c : $*SomeClass
  dealloc_box %b : $<τ_0_0> { var τ_0_0 } <SomeClass>
  %11 = tuple ()
  return %11 : $()
}


sil [ossa] @assign_test_addressonly : $@convention(thin) <T> (@in T) -> @out T {
bb0(%0 : $*T, %1 : $*T):
  %b = alloc_box $<τ_0_0> { var τ_0_0 } <T>
  %ba = project_box %b : $<τ_0_0> { var τ_0_0 } <T>, 0
  %2 = mark_uninitialized [var] %ba : $*T
  copy_addr %1 to %2 : $*T
  copy_addr [take] %1 to %2 : $*T
  copy_addr %2 to [initialization] %0 : $*T
  destroy_value %b : $<τ_0_0> { var τ_0_0 } <T>
  %9 = tuple ()
  return %9 : $()
}

sil [ossa] @assign_test_unowned : $@convention(thin) () -> () {
bb0:
  %b = alloc_box $<τ_0_0> { var τ_0_0 } <@sil_unowned SomeClass>
  %ba = project_box %b : $<τ_0_0> { var τ_0_0 } <@sil_unowned SomeClass>, 0
  %c = mark_uninitialized [var] %ba : $*@sil_unowned SomeClass

  %f = function_ref @getSomeClass : $@convention(thin) () -> @owned SomeClass

  %4 = apply %f() : $@convention(thin) () -> @owned SomeClass
  %5 = ref_to_unowned %4 : $SomeClass to $@sil_unowned SomeClass
  %6 = copy_value %5 : $@sil_unowned SomeClass
  assign %6 to %c : $*@sil_unowned SomeClass
  destroy_value %4 : $SomeClass
  %8 = apply %f() : $@convention(thin) () -> @owned SomeClass
  %9 = ref_to_unowned %8 : $SomeClass to $@sil_unowned SomeClass
  %10 = copy_value %9 : $@sil_unowned SomeClass
  assign %10 to %c : $*@sil_unowned SomeClass

  destroy_value %8 : $SomeClass
  destroy_addr %c : $*@sil_unowned SomeClass
  dealloc_box %b : $<τ_0_0> { var τ_0_0 } <@sil_unowned SomeClass>

  %11 = tuple ()
  return %11 : $()
}



struct ContainsNativeObject {
  var x : Builtin.Int32
  var y : Builtin.NativeObject
}

sil [ossa] @test_struct : $@convention(thin) (@inout ContainsNativeObject) -> () {
bb0(%0 : $*ContainsNativeObject):
  %b = alloc_box $<τ_0_0> { var τ_0_0 } <ContainsNativeObject>
  %ba = project_box %b : $<τ_0_0> { var τ_0_0 } <ContainsNativeObject>, 0
  %c = mark_uninitialized [var] %ba : $*ContainsNativeObject
  %1 = load [copy] %0 : $*ContainsNativeObject
  assign %1 to %c : $*ContainsNativeObject

  destroy_value %b : $<τ_0_0> { var τ_0_0 } <ContainsNativeObject>
  %x = tuple ()
  return %x : $()
}

sil [ossa] @non_box_assign_trivial : $@convention(thin) (@inout Bool, Bool) -> () {
bb0(%0 : $*Bool, %1 : $Bool):
  assign %1 to %0 : $*Bool
  %9 = tuple ()
  return %9 : $()
}
sil [ossa] @non_box_assign : $@convention(thin) (@inout SomeClass, @owned SomeClass) -> () {
bb0(%0 : $*SomeClass, %1 : @owned $SomeClass):
  assign %1 to %0 : $*SomeClass
  %9 = tuple ()
  return %9 : $()
}

sil_global @int_global : $Builtin.Int32

// CHECK-LABEL: sil [ossa] @test_tlc
// CHECK-NOT: mark_uninitialized
// CHECK: return
sil [ossa] @test_tlc : $() -> () {
  %0 = global_addr @int_global : $*Builtin.Int32
  %1 = mark_uninitialized [var] %0 : $*Builtin.Int32

  %9 = tuple ()
  return %9 : $()
}


struct XYStruct { var x, y : Builtin.Int32 }
sil @init_xy_struct : $@convention(thin) () -> XYStruct



protocol P {}
class C : P {}

sil @use : $@convention(thin) (@in P) -> ()


sil [ossa] @release_not_constructed : $@convention(thin) () -> () {
bb0:
  %3 = alloc_stack $SomeClass
  %c = mark_uninitialized [var] %3 : $*SomeClass
  destroy_addr %c : $*SomeClass
  dealloc_stack %3 : $*SomeClass
  %15 = tuple ()
  return %15 : $()
}

sil [ossa] @release_some_constructed : $@convention(thin) () -> () {
bb0:
  %0 = tuple ()
  %b = alloc_stack $(SomeClass, SomeClass)
  %1 = mark_uninitialized [var] %b : $*(SomeClass, SomeClass)
  %2 = function_ref @getSomeClass : $@convention(thin) () -> @owned SomeClass
  %3 = apply %2() : $@convention(thin) () -> @owned SomeClass
  %4 = tuple_element_addr %1 : $*(SomeClass, SomeClass), 0
  store %3 to [init] %4 : $*SomeClass
  destroy_addr %1 : $*(SomeClass, SomeClass)
  dealloc_stack %b : $*(SomeClass, SomeClass)
  %8 = tuple ()
  return %8 : $()
}

sil [ossa] @init_existential_with_class : $@convention(thin) (@inout C) -> () {
entry(%a : $*C):
  %p = alloc_stack $P
  %b = mark_uninitialized [var] %p : $*P
  %q = init_existential_addr %b : $*P, $C
  copy_addr %a to [initialization] %q : $*C
  %u = function_ref @use : $@convention(thin) (@in P) -> ()
  %v = apply %u(%b) : $@convention(thin) (@in P) -> ()
  dealloc_stack %p : $*P
  %z = tuple ()
  return %z : $()
}

sil [ossa] @conditional_init : $@convention(thin) (Bool) -> () {
bb0(%0 : $Bool):
  %2 = alloc_stack $SomeClass
  %3 = mark_uninitialized [var] %2 : $*SomeClass
  %5 = integer_literal $Builtin.Int1, 1
  cond_br %5, bb1, bb2

bb1:
  %f = function_ref @getSomeClass : $@convention(thin) () -> @owned SomeClass
  %6 = apply %f() : $@convention(thin) () -> @owned SomeClass
  assign %6 to %3 : $*SomeClass
  br bb2

bb2:
  destroy_addr %3 : $*SomeClass
  dealloc_stack %2 : $*SomeClass
  %14 = tuple ()
  return %14 : $()
}

sil [ossa] @conditionalInitOrAssign : $@convention(thin) (Builtin.Int1) -> () {
bb0(%0 : $Builtin.Int1):
  %5 = alloc_stack $SomeClass
  %6 = mark_uninitialized [var] %5 : $*SomeClass
  cond_br %0, bb1, bb2

bb1:
  %2 = function_ref @getSomeClass : $@convention(thin) () -> @owned SomeClass
  %12 = apply %2() : $@convention(thin) () -> @owned SomeClass
  assign %12 to %6 : $*SomeClass                // id: %13
  br bb2                                          // id: %14

bb2:
  %3 = function_ref @getSomeClass : $@convention(thin) () -> @owned SomeClass
  %17 = apply %3() : $@convention(thin) () -> @owned SomeClass
  assign %17 to %6 : $*SomeClass                // id: %18
  destroy_addr %6 : $*SomeClass                 // id: %19
  dealloc_stack %5 : $*SomeClass // id: %20
  %23 = tuple ()                                  // user: %24
  return %23 : $()                                // id: %24
}

class RootClassWithIVars {
  var x: Builtin.Int32
  var y: Builtin.Int32
  var z: (Builtin.Int32, Builtin.Int32)
  init()
}

/// Root class tests.
sil [ossa] @rootclass_test1 : $@convention(method) (@owned RootClassWithIVars, Builtin.Int32) -> @owned RootClassWithIVars {
bb0(%0 : @owned $RootClassWithIVars, %1 : $Builtin.Int32):
  %3 = mark_uninitialized [rootself] %0 : $RootClassWithIVars
  %4 = begin_borrow %3 : $RootClassWithIVars
  %10 = ref_element_addr %4 : $RootClassWithIVars, #RootClassWithIVars.x
  assign %1 to %10 : $*Builtin.Int32

  %11 = ref_element_addr %4 : $RootClassWithIVars, #RootClassWithIVars.y
  assign %1 to %11 : $*Builtin.Int32

  %12 = ref_element_addr %4 : $RootClassWithIVars, #RootClassWithIVars.z
  %13 = tuple_element_addr %12 : $*(Builtin.Int32, Builtin.Int32), 0
  assign %1 to %13 : $*Builtin.Int32
  %14 = tuple_element_addr %12 : $*(Builtin.Int32, Builtin.Int32), 1
  assign %1 to %14 : $*Builtin.Int32
  end_borrow %4 : $RootClassWithIVars
  return %3 : $RootClassWithIVars
}

class DerivedClassWithIVars : RootClassWithIVars {
  var a: Builtin.Int32
  override init()
}

sil @superinit : $@convention(method) (@owned RootClassWithIVars) -> @owned RootClassWithIVars


sil [ossa] @derived_test1 : $@convention(method) (@owned DerivedClassWithIVars) -> @owned DerivedClassWithIVars {
bb0(%0 : @owned $DerivedClassWithIVars):
  %1 = alloc_box $<τ_0_0> { var τ_0_0 } <DerivedClassWithIVars>
  %1a = project_box %1 : $<τ_0_0> { var τ_0_0 } <DerivedClassWithIVars>, 0
  %3 = mark_uninitialized [derivedself] %1a : $*DerivedClassWithIVars
  store %0 to [init] %3 : $*DerivedClassWithIVars

  // Get an int
  %5 = function_ref @makesInt : $@convention(thin) () -> Builtin.Int32
  %7 = apply %5() : $@convention(thin) () -> Builtin.Int32

  // Initialize the 'a' ivar with the int.
  %8 = load_borrow %3 : $*DerivedClassWithIVars
  %9 = ref_element_addr %8 : $DerivedClassWithIVars, #DerivedClassWithIVars.a
  assign %7 to %9 : $*Builtin.Int32
  end_borrow %8 : $DerivedClassWithIVars

  %11 = load [take] %3 : $*DerivedClassWithIVars
  %13 = upcast %11 : $DerivedClassWithIVars to $RootClassWithIVars
  %14 = function_ref @superinit : $@convention(method) (@owned RootClassWithIVars) -> @owned RootClassWithIVars
  %15 = apply %14(%13) : $@convention(method) (@owned RootClassWithIVars) -> @owned RootClassWithIVars
  %16 = unconditional_checked_cast %15 : $RootClassWithIVars to $DerivedClassWithIVars
  assign %16 to %3 : $*DerivedClassWithIVars

  %18 = load [copy] %3 : $*DerivedClassWithIVars
  destroy_value %1 : $<τ_0_0> { var τ_0_0 } <DerivedClassWithIVars>
  return %18 : $DerivedClassWithIVars
}

struct MyStruct : P {}

sil [ossa] @self_init_assert_instruction : $@convention(thin) (Builtin.Int32, @thin MyStruct.Type) -> MyStruct {
bb0(%0 : $Builtin.Int32, %1 : $@thin MyStruct.Type):
  %2 = alloc_stack $MyStruct, var, name "sf"
  %3 = mark_uninitialized [delegatingself] %2 : $*MyStruct
  %6 = function_ref @selfinit : $@convention(thin) () -> MyStruct
  %7 = apply %6() : $@convention(thin) () -> MyStruct
  assign %7 to %3 : $*MyStruct
  %9 = load [trivial] %3 : $*MyStruct
  dealloc_stack %2 : $*MyStruct
  return %9 : $MyStruct
}

sil @selfinit : $@convention(thin) () -> MyStruct

struct MyStruct2 {
  var x: P
    init(delegate: ())
    init()
}

sil @selfinit_delegate : $@convention(thin) (@thin MyStruct2.Type) -> @out MyStruct2

sil [ossa] @self_init_copyaddr : $@convention(thin) (@thin MyStruct2.Type) -> @out MyStruct2 {
bb0(%0 : $*MyStruct2, %1 : $@thin MyStruct2.Type):
  %2 = alloc_stack $MyStruct2, var, name "sf"
  %3 = mark_uninitialized [delegatingself] %2 : $*MyStruct2
  %6 = metatype $@thin MyStruct2.Type
  %7 = function_ref @selfinit_delegate : $@convention(thin) (@thin MyStruct2.Type) -> @out MyStruct2
  %8 = alloc_stack $MyStruct2
  apply %7(%8, %6) : $@convention(thin) (@thin MyStruct2.Type) -> @out MyStruct2
  copy_addr [take] %8 to %3 : $*MyStruct2
  dealloc_stack %8 : $*MyStruct2
  copy_addr [take] %3 to [initialization] %0 : $*MyStruct2
  dealloc_stack %2 : $*MyStruct2
  %13 = tuple ()
  return %13 : $()
}

class RootClassWithNontrivialStoredProperties {
  var x, y: SomeClass
  init()
}

class DerivedClassWithNontrivialStoredProperties : RootClassWithNontrivialStoredProperties {
  var a, b: SomeClass
  override init()
}

sil [ossa] @test_root_release : $@convention(method) (@owned RootClassWithNontrivialStoredProperties) -> () {
bb0(%0 : @owned $RootClassWithNontrivialStoredProperties):
  %4 = mark_uninitialized [rootself] %0 : $RootClassWithNontrivialStoredProperties
  destroy_value %4 : $RootClassWithNontrivialStoredProperties
  %13 = tuple ()
  return %13 : $()
}

sil [ossa] @test_root_partial_release : $@convention(method) (@owned RootClassWithNontrivialStoredProperties) -> () {
bb0(%0 : @owned $RootClassWithNontrivialStoredProperties):
  %4 = mark_uninitialized [rootself] %0 : $RootClassWithNontrivialStoredProperties
  %1 = alloc_ref $SomeClass
  %5 = begin_borrow %4 : $RootClassWithNontrivialStoredProperties
  %2 = ref_element_addr %5 : $RootClassWithNontrivialStoredProperties, #RootClassWithNontrivialStoredProperties.x
  assign %1 to %2 : $*SomeClass
  end_borrow %5 : $RootClassWithNontrivialStoredProperties
  destroy_value %4 : $RootClassWithNontrivialStoredProperties
  %13 = tuple ()
  return %13 : $()
}

sil [ossa] @test_derived_release : $@convention(method) (@owned DerivedClassWithNontrivialStoredProperties) -> () {
bb0(%0 : @owned $DerivedClassWithNontrivialStoredProperties):
  %1 = alloc_stack $DerivedClassWithNontrivialStoredProperties
  %4 = mark_uninitialized [derivedself] %1 : $*DerivedClassWithNontrivialStoredProperties
  store %0 to [init] %4 : $*DerivedClassWithNontrivialStoredProperties
  destroy_addr %4 : $*DerivedClassWithNontrivialStoredProperties
  dealloc_stack %1 : $*DerivedClassWithNontrivialStoredProperties
  %13 = tuple ()
  return %13 : $()
}

sil [ossa] @test_derived_partial_release : $@convention(method) (@owned DerivedClassWithNontrivialStoredProperties) -> () {
bb0(%0 : @owned $DerivedClassWithNontrivialStoredProperties):
  %1 = alloc_stack $DerivedClassWithNontrivialStoredProperties
  %4 = mark_uninitialized [derivedself] %1 : $*DerivedClassWithNontrivialStoredProperties
  store %0 to [init] %4 : $*DerivedClassWithNontrivialStoredProperties

  %8 = alloc_ref $SomeClass

  %9 = load_borrow %4 : $*DerivedClassWithNontrivialStoredProperties
  %10 = ref_element_addr %9 : $DerivedClassWithNontrivialStoredProperties, #DerivedClassWithNontrivialStoredProperties.a
  assign %8 to %10 : $*SomeClass
  end_borrow %9 : $DerivedClassWithNontrivialStoredProperties

  destroy_addr %4 : $*DerivedClassWithNontrivialStoredProperties
  dealloc_stack %1 : $*DerivedClassWithNontrivialStoredProperties
  %13 = tuple ()
  return %13 : $()
}

sil [ossa] @test_delegating_box_release : $@convention(method) (@owned RootClassWithNontrivialStoredProperties) -> () {
bb0(%0 : @owned $RootClassWithNontrivialStoredProperties):
  %2 = alloc_box $<τ_0_0> { var τ_0_0 } <RootClassWithNontrivialStoredProperties>
  %2a = project_box %2 : $<τ_0_0> { var τ_0_0 } <RootClassWithNontrivialStoredProperties>, 0
  %4 = mark_uninitialized [delegatingself] %2a : $*RootClassWithNontrivialStoredProperties
  store %0 to [init] %4 : $*RootClassWithNontrivialStoredProperties
  destroy_value %2 : $<τ_0_0> { var τ_0_0 } <RootClassWithNontrivialStoredProperties>
  %13 = tuple ()
  return %13 : $()
}

sil [ossa] @test_delegating_rvalue_release : $@convention(method) (@owned RootClassWithNontrivialStoredProperties) -> () {
bb0(%0 : @owned $RootClassWithNontrivialStoredProperties):
  %2 = alloc_box $<τ_0_0> { var τ_0_0 } <RootClassWithNontrivialStoredProperties>
  %2a = project_box %2 : $<τ_0_0> { var τ_0_0 } <RootClassWithNontrivialStoredProperties>, 0
  %4 = mark_uninitialized [delegatingself] %2a : $*RootClassWithNontrivialStoredProperties
  store %0 to [init] %4 : $*RootClassWithNontrivialStoredProperties
  %6 = load [take] %4 : $*RootClassWithNontrivialStoredProperties
  destroy_value %6 : $RootClassWithNontrivialStoredProperties
  destroy_value %2 : $<τ_0_0> { var τ_0_0 } <RootClassWithNontrivialStoredProperties>
  %13 = tuple ()
  return %13 : $()
}

sil [ossa] @test_delegating_derived_release : $@convention(method) (@owned DerivedClassWithNontrivialStoredProperties) -> () {
bb0(%0 : @owned $DerivedClassWithNontrivialStoredProperties):
  %2 = alloc_stack $DerivedClassWithNontrivialStoredProperties
  %4 = mark_uninitialized [delegatingself] %2 : $*DerivedClassWithNontrivialStoredProperties
  store %0 to [init] %4 : $*DerivedClassWithNontrivialStoredProperties
  destroy_addr %4 : $*DerivedClassWithNontrivialStoredProperties
  dealloc_stack %2 : $*DerivedClassWithNontrivialStoredProperties
  %13 = tuple ()
  return %13 : $()
}

sil [ossa] @super_init_out_of_order :  $@convention(method) (@owned DerivedClassWithIVars, Builtin.Int32) -> @owned DerivedClassWithIVars {
bb0(%0 : @owned $DerivedClassWithIVars, %i : $Builtin.Int32):
  %1 = alloc_box $<τ_0_0> { var τ_0_0 } <DerivedClassWithIVars>
  %1a = project_box %1 : $<τ_0_0> { var τ_0_0 } <DerivedClassWithIVars>, 0
  %3 = mark_uninitialized [derivedself] %1a : $*DerivedClassWithIVars
  store %0 to [init] %3 : $*DerivedClassWithIVars

  %8 = load_borrow %3 : $*DerivedClassWithIVars
  %9 = ref_element_addr %8 : $DerivedClassWithIVars, #DerivedClassWithIVars.a
  assign %i to %9 : $*Builtin.Int32
  end_borrow %8 : $DerivedClassWithIVars

  %a = load [take] %3 : $*DerivedClassWithIVars
  %b = upcast %a : $DerivedClassWithIVars to $RootClassWithIVars
  %borrowed_b = begin_borrow %b : $RootClassWithIVars
  %c = ref_element_addr %borrowed_b : $RootClassWithIVars, #RootClassWithIVars.x
  load [trivial] %c : $*Builtin.Int32
  end_borrow %borrowed_b : $RootClassWithIVars
  %14 = function_ref @superinit : $@convention(method) (@owned RootClassWithIVars) -> @owned RootClassWithIVars
  %15 = apply %14(%b) : $@convention(method) (@owned RootClassWithIVars) -> @owned RootClassWithIVars

  %16 = unconditional_checked_cast %15 : $RootClassWithIVars to $DerivedClassWithIVars
  assign %16 to %3 : $*DerivedClassWithIVars
  %18 = load [copy] %3 : $*DerivedClassWithIVars
  destroy_value %1 : $<τ_0_0> { var τ_0_0 } <DerivedClassWithIVars>
  return %18 : $DerivedClassWithIVars
}


struct MyStruct3 {
  @_hasStorage var c: C
}
sil @selfinit_mystruct3 : $@convention(thin) () -> @owned MyStruct3

sil hidden [ossa] @test_conditional_destroy_delegating_init : $@convention(thin) (Builtin.Int1) -> () {
bb0(%0 : $Builtin.Int1):
  %2 = alloc_stack $MyStruct3
  %3 = mark_uninitialized [delegatingself] %2 : $*MyStruct3
  cond_br %0, bb1, bb2

bb1:
  %9 = function_ref @selfinit_mystruct3 : $@convention(thin) () -> @owned MyStruct3
  %10 = apply %9() : $@convention(thin) () -> @owned MyStruct3
  assign %10 to %3 : $*MyStruct3
  br bb2

bb2:
  destroy_addr %3 : $*MyStruct3
  dealloc_stack %2 : $*MyStruct3
  %15 = tuple ()
  return %15 : $()
}

class MyClass3 {
}
sil @selfinit_myclass3 : $@convention(thin) (@owned MyClass3) -> @owned MyClass3

sil hidden [ossa] @test_conditional_destroy_class_delegating_init : $@convention(thin) (Builtin.Int1) -> () {
bb0(%0 : $Builtin.Int1):
  %2 = alloc_stack $MyClass3
  %3 = mark_uninitialized [delegatingself] %2 : $*MyClass3
  cond_br %0, bb1, bb2

bb1:
  %4 = load [take] %3 : $*MyClass3
  %5 = function_ref @selfinit_myclass3 : $@convention(thin) (@owned MyClass3) -> @owned MyClass3
  %6 = apply %5(%4) : $@convention(thin) (@owned MyClass3) -> @owned MyClass3
  store %6 to [init] %3 : $*MyClass3
  br bb2

bb2:
  destroy_addr %3 : $*MyClass3
  dealloc_stack %2 : $*MyClass3
  %7 = tuple ()
  return %7 : $()
}
