| // RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all %s -devirtualizer -sil-combine -enable-resilience | %FileCheck %s |
| sil_stage canonical |
| |
| import Builtin |
| |
| protocol P { |
| func f() |
| } |
| |
| extension P { |
| func f() |
| } |
| |
| class C<T, U> : P {} |
| |
| sil hidden_external [transparent] [thunk] @witness_thunk : $@convention(witness_method: P) <τ_0_0><τ_1_0, τ_1_1 where τ_0_0 : C<τ_1_0, τ_1_1>> (@in_guaranteed τ_0_0) -> () |
| |
| // CHECK-LABEL: sil hidden @caller : $@convention(thin) <T, U> (@owned C<T, U>) -> () |
| // CHECK: [[FN:%.*]] = function_ref @witness_thunk |
| // CHECK: apply [[FN]]<C<T, U>, T, U>( |
| // CHECK: return |
| sil hidden @caller : $@convention(thin) <T, U> (@owned C<T, U>) -> () { |
| bb0(%0 : $C<T, U>): |
| strong_retain %0 : $C<T, U> |
| %4 = alloc_stack $C<T, U> |
| store %0 to %4 : $*C<T, U> |
| %6 = witness_method $C<T, U>, #P.f!1 : <Self where Self : P> (Self) -> () -> () : $@convention(witness_method: P) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> () |
| %7 = apply %6<C<T, U>>(%4) : $@convention(witness_method: P) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> () |
| dealloc_stack %4 : $*C<T, U> |
| strong_release %0 : $C<T, U> |
| %9 = tuple () |
| return %9 : $() |
| } |
| |
| sil_vtable C {} |
| |
| sil_witness_table hidden <T, U> C<T, U>: P module clsx { |
| method #P.f!1: <Self where Self : P> (Self) -> () -> () : @witness_thunk |
| } |
| |
| sil_default_witness_table hidden P { |
| } |