// RUN: %target-swift-emit-silgen %s | %FileCheck %s // RUN: %target-swift-emit-ir %s protocol P {} protocol Q : P {} class ConcreteBase { func f(_: U) {} } class ConcreteDerivedFromConcreteBase : ConcreteBase { override func f(_: U) {} } class GenericDerivedFromConcreteBase : ConcreteBase { override func f(_: U) {} } class GenericBase { func f(_: U) {} } class ConcreteDerivedFromGenericBase : GenericBase { override func f(_: U) {} } class GenericDerivedFromGenericBase : GenericBase<(T) -> Int> { override func f(_: U) {} } // Make sure we call these methods with the correct substitution map. func call(_ t: T, _ u: U) { ConcreteDerivedFromConcreteBase().f(u) GenericDerivedFromConcreteBase().f(u) ConcreteDerivedFromGenericBase().f(u) GenericDerivedFromGenericBase().f(u) } // All the vtable thunks should traffic in , because that's // what the base method declares. // CHECK-LABEL: sil private [thunk] [ossa] @$s24vtable_generic_signature019ConcreteDerivedFromD4BaseC1fyyxAA1PRzlFAA0dG0CADyyxAA1QRzlFTV : $@convention(method) <τ_0_0 where τ_0_0 : Q> (@in_guaranteed τ_0_0, @guaranteed ConcreteDerivedFromConcreteBase) -> () // CHECK-LABEL: sil private [thunk] [ossa] @$s24vtable_generic_signature30GenericDerivedFromConcreteBaseC1fyyqd__AA1PRd__lFAA0gH0CADyyxAA1QRzlFTV : $@convention(method) <τ_0_0><τ_1_0 where τ_1_0 : Q> (@in_guaranteed τ_1_0, @guaranteed GenericDerivedFromConcreteBase<τ_0_0>) -> () // CHECK-LABEL: sil private [thunk] [ossa] @$s24vtable_generic_signature30ConcreteDerivedFromGenericBaseC1fyyxAA1PRzlFAA0gH0CADyyqd__AA1QRd__lFTV : $@convention(method) <τ_0_0 where τ_0_0 : Q> (@in_guaranteed τ_0_0, @guaranteed ConcreteDerivedFromGenericBase) -> () // CHECK-LABEL: sil private [thunk] [ossa] @$s24vtable_generic_signature018GenericDerivedFromD4BaseC1fyyqd__AA1PRd__lFAA0dG0CADyyqd__AA1QRd__lFTV : $@convention(method) <τ_0_0><τ_1_0 where τ_1_0 : Q> (@in_guaranteed τ_1_0, @guaranteed GenericDerivedFromGenericBase<τ_0_0>) -> () // CHECK-LABEL: sil_vtable ConcreteBase { // CHECK-NEXT: #ConcreteBase.f: (ConcreteBase) -> (U) -> () : @$s24vtable_generic_signature12ConcreteBaseC1fyyxAA1QRzlF // CHECK-NEXT: #ConcreteBase.init!allocator: (ConcreteBase.Type) -> () -> ConcreteBase : @$s24vtable_generic_signature12ConcreteBaseCACycfC // CHECK-NEXT: #ConcreteBase.deinit!deallocator: @$s24vtable_generic_signature12ConcreteBaseCfD // CHECK-NEXT: } // CHECK-LABEL: sil_vtable ConcreteDerivedFromConcreteBase { // CHECK-NEXT: #ConcreteBase.f: (ConcreteBase) -> (U) -> () : @$s24vtable_generic_signature019ConcreteDerivedFromD4BaseC1fyyxAA1PRzlFAA0dG0CADyyxAA1QRzlFTV [override] // CHECK-NEXT: #ConcreteBase.init!allocator: (ConcreteBase.Type) -> () -> ConcreteBase : @$s24vtable_generic_signature019ConcreteDerivedFromD4BaseCACycfC [override] // CHECK-NEXT: #ConcreteDerivedFromConcreteBase.f: (ConcreteDerivedFromConcreteBase) -> (U) -> () : @$s24vtable_generic_signature019ConcreteDerivedFromD4BaseC1fyyxAA1PRzlF // CHECK-NEXT: #ConcreteDerivedFromConcreteBase.deinit!deallocator: @$s24vtable_generic_signature019ConcreteDerivedFromD4BaseCfD // CHECK-NEXT: } // CHECK-LABEL: sil_vtable GenericDerivedFromConcreteBase { // CHECK-NEXT: #ConcreteBase.f: (ConcreteBase) -> (U) -> () : @$s24vtable_generic_signature30GenericDerivedFromConcreteBaseC1fyyqd__AA1PRd__lFAA0gH0CADyyxAA1QRzlFTV [override] // CHECK-NEXT: #ConcreteBase.init!allocator: (ConcreteBase.Type) -> () -> ConcreteBase : @$s24vtable_generic_signature30GenericDerivedFromConcreteBaseCACyxGycfC [override] // CHECK-NEXT: #GenericDerivedFromConcreteBase.f: (GenericDerivedFromConcreteBase) -> (U) -> () : @$s24vtable_generic_signature30GenericDerivedFromConcreteBaseC1fyyqd__AA1PRd__lF // CHECK-NEXT: #GenericDerivedFromConcreteBase.deinit!deallocator: @$s24vtable_generic_signature30GenericDerivedFromConcreteBaseCfD // CHECK-NEXT: } // CHECK-LABEL: sil_vtable GenericBase { // CHECK-NEXT: #GenericBase.f: (GenericBase) -> (U) -> () : @$s24vtable_generic_signature11GenericBaseC1fyyqd__AA1QRd__lF // CHECK-NEXT: #GenericBase.init!allocator: (GenericBase.Type) -> () -> GenericBase : @$s24vtable_generic_signature11GenericBaseCACyxGycfC // CHECK-NEXT: #GenericBase.deinit!deallocator: @$s24vtable_generic_signature11GenericBaseCfD // CHECK-NEXT: } // CHECK-LABEL: sil_vtable ConcreteDerivedFromGenericBase { // CHECK-NEXT: #GenericBase.f: (GenericBase) -> (U) -> () : @$s24vtable_generic_signature30ConcreteDerivedFromGenericBaseC1fyyxAA1PRzlFAA0gH0CADyyqd__AA1QRd__lFTV [override] // CHECK-NEXT: #GenericBase.init!allocator: (GenericBase.Type) -> () -> GenericBase : @$s24vtable_generic_signature30ConcreteDerivedFromGenericBaseCACycfC [override] // CHECK-NEXT: #ConcreteDerivedFromGenericBase.f: (ConcreteDerivedFromGenericBase) -> (U) -> () : @$s24vtable_generic_signature30ConcreteDerivedFromGenericBaseC1fyyxAA1PRzlF // CHECK-NEXT: #ConcreteDerivedFromGenericBase.deinit!deallocator: @$s24vtable_generic_signature30ConcreteDerivedFromGenericBaseCfD // CHECK-NEXT: } // CHECK-LABEL: sil_vtable GenericDerivedFromGenericBase { // CHECK-NEXT: #GenericBase.f: (GenericBase) -> (U) -> () : @$s24vtable_generic_signature018GenericDerivedFromD4BaseC1fyyqd__AA1PRd__lFAA0dG0CADyyqd__AA1QRd__lFTV [override] // CHECK-NEXT: #GenericBase.init!allocator: (GenericBase.Type) -> () -> GenericBase : @$s24vtable_generic_signature018GenericDerivedFromD4BaseCACyxGycfC [override] // CHECK-NEXT: #GenericDerivedFromGenericBase.f: (GenericDerivedFromGenericBase) -> (U) -> () : @$s24vtable_generic_signature018GenericDerivedFromD4BaseC1fyyqd__AA1PRd__lF // CHECK-NEXT: #GenericDerivedFromGenericBase.deinit!deallocator: @$s24vtable_generic_signature018GenericDerivedFromD4BaseCfD // CHECK-NEXT: }