// First parse this and then emit a *.sib. Then read in the *.sib, then recreate // RUN: rm -rfv %t // RUN: mkdir %t // FIXME: sil-opt -verify is broken // RUN: %target-sil-opt %s -assume-parsing-unqualified-ownership-sil -enable-sil-opaque-values -emit-sib -o %t/tmp.sib -module-name opaqueval // RUN: %target-sil-opt %t/tmp.sib -assume-parsing-unqualified-ownership-sil -enable-sil-opaque-values -verify -o %t/tmp.2.sib -module-name opaqueval // RUN: %target-sil-opt %t/tmp.2.sib -assume-parsing-unqualified-ownership-sil -enable-sil-opaque-values -emit-sorted-sil -verify -module-name opaqueval | %FileCheck %s sil_stage canonical import Builtin import Swift protocol Foo { func foo() } struct S : Foo { func foo() init() } // CHECK-LABEL: sil @castOpaque : $@convention(thin) (Int) -> () { // CHECK: bb0([[ARG:%.*]] : $Int): // CHECK: unconditional_checked_cast_value take_always [[ARG]] : $Int to $Foo // CHECK-LABEL: } // end sil function 'castOpaque' sil @castOpaque : $@convention(thin) (Int) -> () { bb0(%0 : $Int): %c = unconditional_checked_cast_value take_always %0 : $Int to $Foo %t = tuple () return %t : $() } // CHECK-LABEL: sil @condCastOpaque : $@convention(thin) (Int) -> () { // CHECK: bb0([[ARG:%.*]] : $Int): // CHECK: checked_cast_value_br [[ARG]] : $Int to $Int // CHECK-LABEL: } // end sil function 'condCastOpaque' sil @condCastOpaque : $@convention(thin) (Int) -> () { bb0(%0 : $Int): %c = checked_cast_value_br %0 : $Int to $Int, bb2, bb1 bb1: br bb3 bb2(%i : $Int): br bb3 bb3: %t = tuple () return %t : $() } // CHECK-LABEL: sil @initDeinitExistentialOpaque : $@convention(thin) (@in T) -> () { // CHECK: bb0([[ARG:%.*]] : $T): // CHECK: [[IE:%.*]] = init_existential_opaque [[ARG]] : $T, $T, $Any // CHECK: deinit_existential_opaque [[IE]] : $Any // CHECK-LABEL: } // end sil function 'initDeinitExistentialOpaque' sil @initDeinitExistentialOpaque : $@convention(thin) (@in T) -> () { bb0(%0 : $T): %i = init_existential_opaque %0 : $T, $T, $Any %d = deinit_existential_opaque %i : $Any %t = tuple () return %t : $() } // CHECK-LABEL: sil @openExistentialOpaque : $@convention(thin) (@in Foo) -> () { // CHECK: bb0([[ARG:%.*]] : $Foo): // CHECK: open_existential_opaque [[ARG]] : $Foo to $@opened({{.*}}) Foo // CHECK-LABEL: } // end sil function 'openExistentialOpaque' sil @openExistentialOpaque : $@convention(thin) (@in Foo) -> () { bb0(%0 : $Foo): %o = open_existential_opaque %0 : $Foo to $@opened("2E9EACA6-FD59-11E6-B016-685B3593C496") Foo %t = tuple () return %t : $() } // Test @in/@out serialization. // ---- // CHECK-LABEL: sil hidden @serialize_identity : $@convention(thin) (@in T) -> @out T { sil hidden @serialize_identity : $@convention(thin) (@in T) -> @out T { // CHECK: bb0(%0 : $T): bb0(%0 : $T): // CHECK: return %0 : $T return %0 : $T } // CHECK-LABEL: } // end sil function 'serialize_identity' // Test @in_guaranteed serialization. // ---- sil @doWithS : $@convention(method) (S) -> () // CHECK-LABEL: sil hidden [transparent] [thunk] @serialize_mutating : $@convention(witness_method) (@in_guaranteed S) -> () { sil hidden [transparent] [thunk] @serialize_mutating : $@convention(witness_method) (@in_guaranteed S) -> () { // CHECK: bb0(%0 : $S): bb0(%0 : $S): %f = function_ref @doWithS : $@convention(method) (S) -> () // CHECK: apply %{{.*}}(%0) : $@convention(method) (S) -> () %a = apply %f(%0) : $@convention(method) (S) -> () %t = tuple () return %t : $() } // CHECK-LABEL: } // end sil function 'serialize_mutating'