// RUN: %target-swift-frontend -enable-objc-interop -assume-parsing-unqualified-ownership-sil -emit-ir %s | %FileCheck %s

// REQUIRES: CPU=x86_64

sil_stage canonical

import Builtin
import Swift
import SwiftShims

class Node {
  @sil_stored var index: Int { get set }
  init(index: Int)
  func check() -> Int
  @objc deinit
}

class ParentNode : Node {
  init(left: Node, right: Node, index: Int)
  @objc deinit
  override init(index: Int)
}

sil @_test_exact_checked_cast_branch : $@convention(method) (@guaranteed Node) -> Int {
bb0(%0 : $Node):
//CHECK-LABEL: define{{.*}}@_test_exact_checked_cast_branch
//CHECK:       = load %swift.type
//CHECK-NEXT:  = icmp eq %swift.type
//CHECK-NEXT:  = bitcast
//CHECK-NEXT:  br i1
  checked_cast_br [exact] %0 : $Node to $ParentNode, bb2, bb3 // id: %2

bb1:                                   // Preds: bb2 bb3
  return undef : $Int

bb2(%5 : $ParentNode):                            // Preds: bb0
  br bb1                               // id: %10

bb3:                                              // Preds: bb0
  br bb1                              // id: %12
}

class BaseBase {
  @inline(never) func foo()
  init()
  deinit
}

class Base<T> : BaseBase {
  override init()
  deinit
}

final class DerivedInt : Base<Int> {
  @inline(never) override final func foo()
  override init()
  deinit
}

sil @test_exact_checked_cast_branch_dynamic_init : $@convention(thin) (@guaranteed BaseBase) -> Int {
bb0(%0 : $BaseBase):
//CHECK-LABEL: define{{.*}}@test_exact_checked_cast_branch_dynamic_init
//CHECK: call swiftcc {{.*}}@"$S9exactcast10DerivedIntCMa"({{.*}})
//CHECK: load
//CHECK: bitcast
//CHECK: icmp eq %swift.type
//CHECK: br
  checked_cast_br [exact] %0 : $BaseBase to $DerivedInt, bb2, bb3 // id: %2

bb1:
  return undef : $Int

bb2(%5 : $DerivedInt):
  br bb1

bb3:
  br bb1
}

sil @_TFC9pic_crash4NodecfMS0_FT5indexSi_S0_ : $@convention(method) (Int, @owned Node) -> @owned Node
sil @_TFC9pic_crash4NodeCfMS0_FT5indexSi_S0_ : $@convention(thin) (Int, @thick Node.Type) -> @owned Node
sil [transparent] @_TFC9pic_crash4Nodeg5indexSi : $@convention(method) (@guaranteed Node) -> Int
sil [transparent] @_TFC9pic_crash4Nodes5indexSi : $@convention(method) (Int, @guaranteed Node) -> ()
sil @_TFC9pic_crash10ParentNodecfMS0_FT4leftCS_4Node5rightS1_5indexSi_S0_ : $@convention(method) (@owned Node, @owned Node, Int, @owned ParentNode) -> @owned ParentNode
sil @_TFC9pic_crash10ParentNodeCfMS0_FT4leftCS_4Node5rightS1_5indexSi_S0_ : $@convention(thin) (@owned Node, @owned Node, Int, @thick ParentNode.Type) -> @owned ParentNode
sil @_TFC9pic_crash10ParentNodecfMS0_FT5indexSi_S0_ : $@convention(method) (Int, @owned ParentNode) -> @owned ParentNode
sil @_TFC9pic_crash10ParentNodeCfMS0_FT5indexSi_S0_ : $@convention(thin) (Int, @thick ParentNode.Type) -> @owned ParentNode

sil_vtable Node {
  #Node.init!initializer.1: @_TFC9pic_crash4NodecfMS0_FT5indexSi_S0_	// pic_crash.Node.init (pic_crash.Node.Type)(index : Swift.Int) -> pic_crash.Node
  #Node.check!1: @_test_exact_checked_cast_branch	// pic_crash.Node.check (pic_crash.Node)() -> Swift.Int
  #Node.index!getter.1: @_TFC9pic_crash4Nodeg5indexSi	// pic_crash.Node.index.getter : Swift.Int
  #Node.index!setter.1: @_TFC9pic_crash4Nodes5indexSi	// pic_crash.Node.index.setter : Swift.Int
}

sil_vtable ParentNode {
  #Node.init!initializer.1: @_TFC9pic_crash10ParentNodecfMS0_FT5indexSi_S0_	// pic_crash.ParentNode.init (pic_crash.ParentNode.Type)(index : Swift.Int) -> pic_crash.ParentNode
  #Node.check!1: @_test_exact_checked_cast_branch	// pic_crash.Node.check (pic_crash.Node)() -> Swift.Int
  #Node.index!getter.1: @_TFC9pic_crash4Nodeg5indexSi	// pic_crash.Node.index.getter : Swift.Int
  #Node.index!setter.1: @_TFC9pic_crash4Nodes5indexSi	// pic_crash.Node.index.setter : Swift.Int
  #ParentNode.init!initializer.1: @_TFC9pic_crash10ParentNodecfMS0_FT4leftCS_4Node5rightS1_5indexSi_S0_	// pic_crash.ParentNode.init (pic_crash.ParentNode.Type)(left : pic_crash.Node, right : pic_crash.Node, index : Swift.Int) -> pic_crash.ParentNode
}

sil @$S5test104BaseB0C3fooyyF : $@convention(method) (@guaranteed BaseBase) -> ()
sil @$S5test104BaseB0CfD : $@convention(method) (@owned BaseBase) -> ()
sil @$S5test14BaseCfD : $@convention(method) (@owned BaseBase) -> ()
sil @$S5test110DerivedIntC3fooyyF : $@convention(method) (@guaranteed DerivedInt) -> ()
sil @$S5test110DerivedIntCfD : $@convention(method) (@owned DerivedInt) -> ()

sil_vtable BaseBase {
  #BaseBase.foo!1: (BaseBase) -> () -> () : @$S5test104BaseB0C3fooyyF
  #BaseBase.deinit!deallocator: @$S5test104BaseB0CfD
}

sil_vtable Base {
  #BaseBase.foo!1: (BaseBase) -> () -> () : @$S5test104BaseB0C3fooyyF [inherited]
  #Base.deinit!deallocator: @$S5test14BaseCfD
}

sil_vtable DerivedInt {
  #BaseBase.foo!1: (BaseBase) -> () -> () : @$S5test110DerivedIntC3fooyyF [override]
  #DerivedInt.deinit!deallocator: @$S5test110DerivedIntCfD
}
