| // RUN: %target-swift-frontend -module-name bridged_casts_folding -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-NOT: copy_addr |
| // CHECK: [[BRIDGED:%.*]] = apply {{.*}}(%0) |
| // CHECK-NOT: destroy_addr |
| // CHECK-NEXT: checked_cast_br [[BRIDGED]] : $NSObject to $NSObjectSubclass, [[YES:bb[0-9]+]], [[NO:bb[0-9]+]] |
| // CHECK: [[YES]]{{.*}}: |
| // CHECK-NOT: dealloc_stack |
| // CHECK: [[NO]]{{.*}}: |
| // CHECK-NOT: dealloc_stack |
| 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 |
| } |