// RUN: %target-sil-opt -sil-print-types %s | %FileCheck %s sil_stage canonical import Builtin import Swift class Klass { } class SubKlass : Klass { } struct NonTrivialStruct { var id:Klass } // CHECK-LABEL: sil [ossa] @unchecked_ref_cast_test : sil [ossa] @unchecked_ref_cast_test : $@convention(thin) (@in T, @owned Klass) -> () { bb0(%0 : $*T, %1 : @owned $Klass): destroy_addr %0 : $*T // CHECK: unchecked_ref_cast %1 : $Klass to $Optional, forwarding: @unowned %3 = unchecked_ref_cast %1 : $Klass to $Optional, forwarding: @unowned %4 = copy_value %3 : $Optional destroy_value %1 : $Klass destroy_value %4 : $Optional %8 = tuple () return %8 : $() } // CHECK-LABEL: } // end sil function 'unchecked_ref_cast_test' // CHECK-LABEL: sil [ossa] @struct_test : sil [ossa] @struct_test : $@convention(thin) (@owned Klass) -> () { bb0(%0 : @owned $Klass): // CHECK-NOT: forwarding: %3 = struct $NonTrivialStruct (%0 : $Klass), forwarding: @owned destroy_value %3 : $NonTrivialStruct %8 = tuple () return %8 : $() } // CHECK-LABEL: } // end sil function 'struct_test' // CHECK-LABEL: sil [ossa] @switch_test : $@convention(thin) () -> () { // CHECK: switch_enum {{.*}}, forwarding: @guaranteed // CHECK-LABEL: } // end sil function 'switch_test' sil [ossa] @switch_test : $@convention(thin) () -> () { %none = enum $Optional, #Optional.none switch_enum %none : $Optional, case #Optional.some!enumelt:bb1, case #Optional.none!enumelt:bb2, forwarding: @guaranteed bb1(%arg : @guaranteed $Klass): br bb3 bb2: br bb3 bb3: %8 = tuple () return %8 : $() } // CHECK-LABEL: sil [ossa] @checked_cast_test : $@convention(thin) (@owned Klass) -> () { // CHECK: checked_cast_br {{.*}}, forwarding: @guaranteed // CHECK-LABEL: } // end sil function 'checked_cast_test' sil [ossa] @checked_cast_test : $@convention(thin) (@owned Klass) -> () { bb0(%0 : @owned $Klass): %trivial = unchecked_ownership_conversion %0 : $Klass, @owned to @none checked_cast_br Klass in %trivial : $Klass to SubKlass, bb1, bb2, forwarding: @guaranteed bb1(%arg1 : @guaranteed $SubKlass): br bb3 bb2(%arg2: @guaranteed $Klass): br bb3 bb3: destroy_value %0 : $Klass %8 = tuple () return %8 : $() }