// RUN: %target-sil-opt -enable-sil-verify-all %s -simplify-cfg | FileCheck %s

// REQUIRES: objc_interop
// FIXME: this test relies on standard library implementation details that are
// only present with Objective-C runtime.

// Check that this SIL compiles without crashes. See rdar://20345557

sil_stage canonical

import Builtin
import Swift
import SwiftShims

class Base {
}

class Derived1: Base {}

class Derived2: Base {}

struct S {}

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

sil @method1 : $@convention(method) <τ_0_0> (@owned @callee_owned (S) -> @out τ_0_0, @guaranteed Derived1) -> @out MyOptional<τ_0_0>
sil @method2 : $@convention(method) <τ_0_0> (@owned @callee_owned (S) -> @out τ_0_0, @guaranteed Base) -> @out MyOptional<τ_0_0>

// CHECK: sil [fragile] @_TFCs27_ContiguousArrayStorageBase25withUnsafeBufferOfObjectsfS_U__FFGVs19UnsafeBufferPointerPs9AnyObject__Q_Q_
sil [fragile] @_TFCs27_ContiguousArrayStorageBase25withUnsafeBufferOfObjectsfS_U__FFGVs19UnsafeBufferPointerPs9AnyObject__Q_Q_ : $@convention(method) <R> (@owned @callee_owned (S) -> @out R, @guaranteed Base) -> @out R {
bb0(%0 : $*R, %1 : $@callee_owned (S) -> @out R, %2 : $Base):
  %3 = alloc_stack $MyOptional<R>                   // users: %9, %12, %13, %15, %20, %26, %33, %42, %50, %54
  checked_cast_br [exact] %2 : $Base to $Derived1, bb1, bb2 // id: %4

bb1(%5 : $Derived1):                    // Preds: bb0
  %6 = function_ref @method1 : $@convention(method) <τ_0_0> (@owned @callee_owned (S) -> @out τ_0_0, @guaranteed Derived1) -> @out MyOptional<τ_0_0> // user: %9
  strong_retain %1 : $@callee_owned (S) -> @out R // id: %7
  strong_retain %2 : $Base // id: %8
  %9 = apply %6<R>(%3, %1, %5) : $@convention(method) <τ_0_0> (@owned @callee_owned (S) -> @out τ_0_0, @guaranteed Derived1) -> @out MyOptional<τ_0_0>
  br bb3                                          // id: %10

bb2:                                              // Preds: bb0
  checked_cast_br [exact] %2 : $Base to $Derived2, bb6, bb7 // id: %11

bb3:                                              // Preds: bb1 bb6 bb8 bb10
  switch_enum_addr %3 : $*MyOptional<R>, case #MyOptional.some!enumelt.1: bb4, case #MyOptional.none!enumelt: bb5 // id: %12

bb4:                                              // Preds: bb3
  %13 = unchecked_take_enum_data_addr %3 : $*MyOptional<R>, #MyOptional.some!enumelt.1 // user: %14
  copy_addr [take] %13 to [initialization] %0 : $*R // id: %14
  dealloc_stack %3 : $*MyOptional<R> // id: %15
  strong_release %2 : $Base // id: %16
  strong_release %1 : $@callee_owned (S) -> @out R // id: %17
  %18 = tuple ()                                  // user: %19
  return %18 : $()                                // id: %19

bb5:                                              // Preds: bb3
  dealloc_stack %3 : $*MyOptional<R> // id: %20
  unreachable                                     // id: %21

bb6(%22 : $Derived2):             // Preds: bb2
  strong_retain %1 : $@callee_owned (S) -> @out R // id: %24
  strong_retain %2 : $Base // id: %25
  br bb3                                          // id: %27

bb7:                                              // Preds: bb2
  checked_cast_br [exact] %2 : $Base to $Base, bb8, bb9 // id: %28

bb8(%29 : $Base):          // Preds: bb7
  %30 = function_ref @method2 : $@convention(method) <τ_0_0> (@owned @callee_owned (S) -> @out τ_0_0, @guaranteed Base) -> @out MyOptional<τ_0_0> // user: %33
  strong_retain %1 : $@callee_owned (S) -> @out R // id: %31
  strong_retain %2 : $Base // id: %32
  %33 = apply %30<R>(%3, %1, %29) : $@convention(method) <τ_0_0> (@owned @callee_owned (S) -> @out τ_0_0, @guaranteed Base) -> @out MyOptional<τ_0_0>
  br bb3                                          // id: %34

bb9:                                              // Preds: bb7
  strong_retain %1 : $@callee_owned (S) -> @out R // id: %35
  checked_cast_br [exact] %2 : $Base to $Derived1, bb11, bb12 // id: %36

bb10(%37 : $()):                                  // Preds: bb11 bb13
  br bb3                                          // id: %38

bb11(%39 : $Derived1):                  // Preds: bb9
  strong_retain %39 : $Derived1         // id: %40
  %41 = function_ref @method1 : $@convention(method) <τ_0_0> (@owned @callee_owned (S) -> @out τ_0_0, @guaranteed Derived1) -> @out MyOptional<τ_0_0> // user: %42
  %42 = apply %41<R>(%3, %1, %39) : $@convention(method) <τ_0_0> (@owned @callee_owned (S) -> @out τ_0_0, @guaranteed Derived1) -> @out MyOptional<τ_0_0> // user: %43
  br bb10(%42 : $())                              // id: %43

bb12:                                             // Preds: bb9
  checked_cast_br [exact] %2 : $Base to $Base, bb14, bb15 // id: %44

bb13(%45 : $()):                                  // Preds: bb14 bb15
  br bb10(%45 : $())                              // id: %46

bb14(%47 : $Base):         // Preds: bb12
  strong_retain %47 : $Base // id: %48
  %49 = function_ref @method2 : $@convention(method) <τ_0_0> (@owned @callee_owned (S) -> @out τ_0_0, @guaranteed Base) -> @out MyOptional<τ_0_0> // user: %50
  %50 = apply %49<R>(%3, %1, %47) : $@convention(method) <τ_0_0> (@owned @callee_owned (S) -> @out τ_0_0, @guaranteed Base) -> @out MyOptional<τ_0_0> // user: %51
  br bb13(%50 : $())                              // id: %51

bb15:                                             // Preds: bb12
  strong_retain %2 : $Base // id: %52
  %54 = tuple ()
  br bb13(%54 : $())                              // id: %55
}

// CHECK-LABEL: sil @multiple_edits_in_adjacent_blocks
// CHECK: bb0(%0 : $*Base):
// CHECK: checked_cast_br %
// CHECK: bb1:
// CHECK: checked_cast_br [exact]
// CHECK-NOT: checked_cast_br
// CHECK: return
sil @multiple_edits_in_adjacent_blocks : $@convention(method) (@in Base) -> () {
bb0(%0 : $*Base):
  %1 = load %0 : $*Base
  checked_cast_br %1 : $Base to $Derived1, bb8, bb1

bb1:
  checked_cast_br [exact] %1 : $Base to $Derived2, bb2, bb5

bb2(%6 : $Derived2):
  %7 = upcast %6 : $Derived2 to $Base
  debug_value %7 : $Base, let, name "self", argno 1
  checked_cast_br [exact] %7 : $Base to $Base, bb3, bb6

bb3(%10 : $Base):
  debug_value %10 : $Base, let, name "self", argno 1
  checked_cast_br %10 : $Base to $Derived1, bb4, bb7

bb4(%13 : $Derived1):
  debug_value %13 : $Derived1, let, name "scr"
  br bb9

bb5:
  br bb9

bb6:
  br bb9

bb7:
  br bb9

bb8(%14 : $Derived1):
  br bb9

bb9:
  %20 = tuple ()
  return %20 : $()
}
