// RUN: %empty-directory(%t) // RUN: %target-build-swift -emit-module -module-name ossa -o %t/ossa.swiftmodule %s // RUN: %target-sil-opt -sil-print-types %t/ossa.swiftmodule | %FileCheck %s sil_stage canonical import Builtin import Swift import SwiftShims class X {} // CHECK-LABEL: sil [serialized] [canonical] [ossa] @test_unchecked_ref_cast sil [serialized] [ossa] @test_unchecked_ref_cast : $@convention(thin) (@guaranteed AnyObject) -> @owned X { bb0(%0 : @guaranteed $AnyObject): // CHECK: %1 = unchecked_ref_cast %0 : $AnyObject to $X, forwarding: @unowned %1 = unchecked_ref_cast %0 : $AnyObject to $X, forwarding: @unowned %2 = copy_value %1 : $X return %2 : $X } struct Wrapper { var _k: X } // CHECK-LABEL: sil [serialized] [canonical] [ossa] @return_borrow_test : $@convention(method) (@in_guaranteed Wrapper) -> @guaranteed X { // CHECK: bb0(%0 : $*Wrapper): // CHECK: %1 = struct_element_addr %0 : $*Wrapper, #Wrapper._k // CHECK: %2 = load_borrow %1 : $*X // CHECK: return_borrow %2 : $X from_scopes (%2 : $X) // CHECK: } sil [serialized] [ossa] @return_borrow_test : $@convention(method) (@in_guaranteed Wrapper) -> @guaranteed X { bb0(%0 : $*Wrapper): %1 = struct_element_addr %0, #Wrapper._k %2 = load_borrow %1 return_borrow %2 from_scopes (%2) } // CHECK-LABEL: sil [serialized] [canonical] [ossa] @reborrowTest : // CHECK: bb1: // CHECK-NEXT: {{%.*}} = begin_borrow %0 : $X // CHECK: bb2: // CHECK-NEXT: {{%.*}} = begin_borrow %0 : $X // CHECK: bb3([[ARG:%.*]] : @reborrow $X): // CHECK-NEXT: {{%.*}} = borrowed [[ARG]] : $X from (%0 : $X) // CHECK: } // end sil function 'reborrowTest' sil [serialized] [ossa] @reborrowTest : $@convention(thin) (@owned X) -> () { bb0(%0 : @owned $X): cond_br undef, bb1, bb2 bb1: %b1 = begin_borrow %0 : $X br bb3(%b1 : $X) bb2: %b2 = begin_borrow %0 : $X br bb3(%b2 : $X) bb3(%r : @reborrow $X): %f = borrowed %r : $X from (%0 : $X) end_borrow %f : $X destroy_value %0 : $X %9999 = tuple() return %9999 : $() }