blob: a3e65d179f391161182276ad8415f0c3457f11d9 [file] [log] [blame]
// RUN: %target-swift-frontend -O -enable-sil-ownership -emit-sil %s | %FileCheck %s
// REQUIRES: objc_interop
sil_stage raw
import Swift
import Foundation
class NSObjectSubclass : NSObject {}
sil_vtable NSObjectSubclass {}
// CHECK-LABEL: sil @anyhashable_cast_unconditional
// CHECK: [[BRIDGED:%.*]] = apply {{.*}}(%0)
// CHECK-NEXT: destroy_addr %0
// CHECK-NEXT: [[CAST:%.*]] = unconditional_checked_cast [[BRIDGED]] : $NSObject to $NSObjectSubclass
sil @anyhashable_cast_unconditional : $@convention(thin) (@in AnyHashable) -> @owned NSObjectSubclass {
entry(%0 : @trivial $*AnyHashable):
%1 = alloc_stack $NSObjectSubclass
unconditional_checked_cast_addr AnyHashable in %0 : $*AnyHashable
to NSObjectSubclass in %1 : $*NSObjectSubclass
%3 = load [take] %1 : $*NSObjectSubclass
dealloc_stack %1 : $*NSObjectSubclass
return %3 : $NSObjectSubclass
}
// CHECK-LABEL: sil @anyhashable_cast_take_always
// CHECK: [[BRIDGED:%.*]] = apply {{.*}}(%0)
// CHECK-NEXT: destroy_addr %0
// CHECK-NEXT: checked_cast_br [[BRIDGED]] : $NSObject to $NSObjectSubclass, [[YES:bb[0-9]+]], [[NO:bb[0-9]+]]
sil @anyhashable_cast_take_always : $@convention(thin) (@in AnyHashable, @owned NSObjectSubclass) -> @owned NSObjectSubclass {
entry(%0 : @trivial $*AnyHashable, %1 : @owned $NSObjectSubclass):
%2 = alloc_stack $NSObjectSubclass
checked_cast_addr_br take_always AnyHashable in %0 : $*AnyHashable
to NSObjectSubclass in %2 : $*NSObjectSubclass, bb1, bb2
bb1:
%4 = load [take] %2 : $*NSObjectSubclass
destroy_value %1 : $NSObjectSubclass
br bb3(%4 : $NSObjectSubclass)
bb2:
br bb3(%1 : $NSObjectSubclass)
bb3(%8 : @owned $NSObjectSubclass):
dealloc_stack %2 : $*NSObjectSubclass
return %8 : $NSObjectSubclass
}
// CHECK-LABEL: sil @anyhashable_cast_take_on_success
// CHECK: [[BRIDGED:%.*]] = apply {{.*}}(%0)
// CHECK-NEXT: checked_cast_br [[BRIDGED]] : $NSObject to $NSObjectSubclass, [[YES:bb[0-9]+]], [[NO:bb[0-9]+]]
// CHECK: [[YES]]{{.*}}:
// CHECK-NEXT: destroy_addr %0
sil @anyhashable_cast_take_on_success : $@convention(thin) (@in AnyHashable, @owned NSObjectSubclass) -> @owned NSObjectSubclass {
entry(%0 : @trivial $*AnyHashable, %1 : @owned $NSObjectSubclass):
%2 = alloc_stack $NSObjectSubclass
checked_cast_addr_br take_on_success AnyHashable in %0 : $*AnyHashable
to NSObjectSubclass in %2 : $*NSObjectSubclass, bb1, bb2
bb1:
%4 = load [take] %2 : $*NSObjectSubclass
destroy_value %1 : $NSObjectSubclass
br bb3(%4 : $NSObjectSubclass)
bb2:
destroy_addr %0 : $*AnyHashable
br bb3(%1 : $NSObjectSubclass)
bb3(%8 : @owned $NSObjectSubclass):
dealloc_stack %2 : $*NSObjectSubclass
return %8 : $NSObjectSubclass
}
// CHECK-LABEL: sil @anyhashable_cast_copy_on_success
// CHECK: copy_addr %0 to [initialization] [[TEMP:%.*]] : $*AnyHashable
// CHECK-NEXT: [[BRIDGED:%.*]] = apply {{.*}}([[TEMP]])
// CHECK-NEXT: destroy_addr [[TEMP]]
// CHECK-NEXT: checked_cast_br [[BRIDGED]] : $NSObject to $NSObjectSubclass, [[YES:bb[0-9]+]], [[NO:bb[0-9]+]]
// CHECK: [[YES]]{{.*}}:
// CHECK-NEXT: dealloc_stack [[TEMP]]
// CHECK: [[NO]]{{.*}}:
// CHECK-NEXT: dealloc_stack [[TEMP]]
sil @anyhashable_cast_copy_on_success : $@convention(thin) (@in_guaranteed AnyHashable, @owned NSObjectSubclass) -> @owned NSObjectSubclass {
entry(%0 : @trivial $*AnyHashable, %1 : @owned $NSObjectSubclass):
%2 = alloc_stack $NSObjectSubclass
checked_cast_addr_br copy_on_success AnyHashable in %0 : $*AnyHashable
to NSObjectSubclass in %2 : $*NSObjectSubclass, bb1, bb2
bb1:
%4 = load [take] %2 : $*NSObjectSubclass
destroy_value %1 : $NSObjectSubclass
br bb3(%4 : $NSObjectSubclass)
bb2:
br bb3(%1 : $NSObjectSubclass)
bb3(%8 : @owned $NSObjectSubclass):
dealloc_stack %2 : $*NSObjectSubclass
return %8 : $NSObjectSubclass
}