3
3
4
4
protocol P { }
5
5
protocol Q : P { }
6
+ class C : P { }
6
7
7
8
class ConcreteBase {
8
9
func f< U : Q > ( _: U ) { }
10
+ func g< U : C > ( _: U ) { }
9
11
}
10
12
11
13
class ConcreteDerivedFromConcreteBase : ConcreteBase {
@@ -37,6 +39,10 @@ func call<T, U : P>(_ t: T, _ u: U) {
37
39
GenericDerivedFromGenericBase < T > ( ) . f ( u)
38
40
}
39
41
42
+ class ConcreteDerived : ConcreteBase {
43
+ override func g< U : P > ( _: U ) { }
44
+ }
45
+
40
46
// All the vtable thunks should traffic in <U where U : Q>, because that's
41
47
// what the base method declares.
42
48
@@ -47,19 +53,22 @@ func call<T, U : P>(_ t: T, _ u: U) {
47
53
48
54
// CHECK-LABEL: sil_vtable ConcreteBase {
49
55
// CHECK-NEXT: #ConcreteBase.f: <U where U : Q> (ConcreteBase) -> (U) -> () : @$s24vtable_generic_signature12ConcreteBaseC1fyyxAA1QRzlF
56
+ // CHECK-NEXT: #ConcreteBase.g: <U where U : C> (ConcreteBase) -> (U) -> () : @$s24vtable_generic_signature12ConcreteBaseC1gyyxAA1CCRbzlF
50
57
// CHECK-NEXT: #ConcreteBase.init!allocator: (ConcreteBase.Type) -> () -> ConcreteBase : @$s24vtable_generic_signature12ConcreteBaseCACycfC
51
58
// CHECK-NEXT: #ConcreteBase.deinit!deallocator: @$s24vtable_generic_signature12ConcreteBaseCfD
52
59
// CHECK-NEXT: }
53
60
54
61
// CHECK-LABEL: sil_vtable ConcreteDerivedFromConcreteBase {
55
62
// CHECK-NEXT: #ConcreteBase.f: <U where U : Q> (ConcreteBase) -> (U) -> () : @$s24vtable_generic_signature019ConcreteDerivedFromD4BaseC1fyyxAA1PRzlFAA0dG0CADyyxAA1QRzlFTV [override]
63
+ // CHECK-NEXT: #ConcreteBase.g: <U where U : C> (ConcreteBase) -> (U) -> () : @$s24vtable_generic_signature12ConcreteBaseC1gyyxAA1CCRbzlF
56
64
// CHECK-NEXT: #ConcreteBase.init!allocator: (ConcreteBase.Type) -> () -> ConcreteBase : @$s24vtable_generic_signature019ConcreteDerivedFromD4BaseCACycfC [override]
57
65
// CHECK-NEXT: #ConcreteDerivedFromConcreteBase.f: <U where U : P> (ConcreteDerivedFromConcreteBase) -> (U) -> () : @$s24vtable_generic_signature019ConcreteDerivedFromD4BaseC1fyyxAA1PRzlF
58
66
// CHECK-NEXT: #ConcreteDerivedFromConcreteBase.deinit!deallocator: @$s24vtable_generic_signature019ConcreteDerivedFromD4BaseCfD
59
67
// CHECK-NEXT: }
60
68
61
69
// CHECK-LABEL: sil_vtable GenericDerivedFromConcreteBase {
62
70
// CHECK-NEXT: #ConcreteBase.f: <U where U : Q> (ConcreteBase) -> (U) -> () : @$s24vtable_generic_signature30GenericDerivedFromConcreteBaseC1fyyqd__AA1PRd__lFAA0gH0CADyyxAA1QRzlFTV [override]
71
+ // CHECK-NEXT: #ConcreteBase.g: <U where U : C> (ConcreteBase) -> (U) -> () : @$s24vtable_generic_signature12ConcreteBaseC1gyyxAA1CCRbzlF
63
72
// CHECK-NEXT: #ConcreteBase.init!allocator: (ConcreteBase.Type) -> () -> ConcreteBase : @$s24vtable_generic_signature30GenericDerivedFromConcreteBaseCACyxGycfC [override]
64
73
// CHECK-NEXT: #GenericDerivedFromConcreteBase.f: <T><U where U : P> (GenericDerivedFromConcreteBase<T>) -> (U) -> () : @$s24vtable_generic_signature30GenericDerivedFromConcreteBaseC1fyyqd__AA1PRd__lF
65
74
// CHECK-NEXT: #GenericDerivedFromConcreteBase.deinit!deallocator: @$s24vtable_generic_signature30GenericDerivedFromConcreteBaseCfD
@@ -84,3 +93,11 @@ func call<T, U : P>(_ t: T, _ u: U) {
84
93
// CHECK-NEXT: #GenericDerivedFromGenericBase.f: <T><U where U : P> (GenericDerivedFromGenericBase<T>) -> (U) -> () : @$s24vtable_generic_signature018GenericDerivedFromD4BaseC1fyyqd__AA1PRd__lF
85
94
// CHECK-NEXT: #GenericDerivedFromGenericBase.deinit!deallocator: @$s24vtable_generic_signature018GenericDerivedFromD4BaseCfD
86
95
// CHECK-NEXT: }
96
+
97
+ // CHECK-LABEL: sil_vtable ConcreteDerived {
98
+ // CHECK-NEXT: #ConcreteBase.f: <U where U : Q> (ConcreteBase) -> (U) -> () : @$s24vtable_generic_signature12ConcreteBaseC1fyyxAA1QRzlF [inherited]
99
+ // CHECK-NEXT: #ConcreteBase.g: <U where U : C> (ConcreteBase) -> (U) -> () : @$s24vtable_generic_signature15ConcreteDerivedC1gyyxAA1PRzlFAA0D4BaseCADyyxAA1CCRbzlFTV [override]
100
+ // CHECK-NEXT: #ConcreteBase.init!allocator: (ConcreteBase.Type) -> () -> ConcreteBase : @$s24vtable_generic_signature15ConcreteDerivedCACycfC [override]
101
+ // CHECK-NEXT: #ConcreteDerived.g: <U where U : P> (ConcreteDerived) -> (U) -> () : @$s24vtable_generic_signature15ConcreteDerivedC1gyyxAA1PRzlF
102
+ // CHECK-NEXT: #ConcreteDerived.deinit!deallocator: @$s24vtable_generic_signature15ConcreteDerivedCfD // ConcreteDerived.__deallocating_deinit
103
+ // CHECK-NEXT: }
0 commit comments