@@ -34,6 +34,13 @@ open class MostDerived : MoreDerived {
34
34
open override func privateMethod4( _: Int ) { }
35
35
}
36
36
37
+ public final class FinalDerived : Base < Int > {
38
+ internal override func privateMethod1( ) { }
39
+ internal override func privateMethod2( _: AnyObject ? ) { }
40
+ internal override func privateMethod3( _: Int ? ) { }
41
+ internal override func privateMethod4( _: Int ) { }
42
+ }
43
+
37
44
// See Inputs/vtables_multifile_2.swift for overrides in a different file.
38
45
// See Inputs/vtables_multifile_3.swift for overrides in a different module.
39
46
@@ -127,7 +134,6 @@ open class MostDerived : MoreDerived {
127
134
// CHECK-NEXT: return [[RESULT]] : $()
128
135
// CHECK-NEXT: }
129
136
130
- // vtable thunk for Derived.privateMethod2(_:) dispatching to MoreDerived.privateMethod2(_:)
131
137
// CHECK-LABEL: sil private [ossa] @$s17vtables_multifile11MoreDerivedC14privateMethod2yyyXlSgFAA0D0CADyyAEFTV : $@convention(method) (@guaranteed Optional<AnyObject>, @guaranteed MoreDerived) -> () {
132
138
// CHECK: bb0(%0 : @guaranteed $Optional<AnyObject>, %1 : @guaranteed $MoreDerived):
133
139
// CHECK-NEXT: [[METHOD:%.*]] = class_method %1 : $MoreDerived, #MoreDerived.privateMethod2!1 : (MoreDerived) -> (AnyObject?) -> (), $@convention(method) (@guaranteed Optional<AnyObject>, @guaranteed MoreDerived) -> ()
@@ -136,7 +142,6 @@ open class MostDerived : MoreDerived {
136
142
// CHECK-NEXT: return [[RESULT]] : $()
137
143
// CHECK-NEXT: }
138
144
139
- // vtable thunk for Derived.privateMethod3(_:) dispatching to MoreDerived.privateMethod3(_:)
140
145
// CHECK-LABEL: il private [ossa] @$s17vtables_multifile11MoreDerivedC14privateMethod3yySiSgFAA0D0CADyyAEFTV : $@convention(method) (Optional<Int>, @guaranteed MoreDerived) -> () {
141
146
// CHECK: bb0(%0 : $Optional<Int>, %1 : @guaranteed $MoreDerived):
142
147
// CHECK-NEXT: [[METHOD:%.*]] = class_method %1 : $MoreDerived, #MoreDerived.privateMethod3!1 : (MoreDerived) -> (Int?) -> (), $@convention(method) (Optional<Int>, @guaranteed MoreDerived) -> ()
@@ -145,7 +150,6 @@ open class MostDerived : MoreDerived {
145
150
// CHECK-NEXT: return [[RESULT]] : $()
146
151
// CHECK-NEXT: }
147
152
148
- // vtable thunk for Derived.privateMethod4(_:) dispatching to MoreDerived.privateMethod4(_:)
149
153
// CHECK-LABEL: sil private [ossa] @$s17vtables_multifile11MoreDerivedC14privateMethod4yySiFAA0D0CADyySiFTV : $@convention(method) (Int, @guaranteed MoreDerived) -> () {
150
154
// CHECK: bb0(%0 : $Int, %1 : @guaranteed $MoreDerived):
151
155
// CHECK-NEXT: [[METHOD:%.*]] = class_method %1 : $MoreDerived, #MoreDerived.privateMethod4!1 : (MoreDerived) -> (Int) -> (), $@convention(method) (Int, @guaranteed MoreDerived) -> ()
@@ -154,6 +158,30 @@ open class MostDerived : MoreDerived {
154
158
// CHECK-NEXT: return [[RESULT]] : $()
155
159
// CHECK-NEXT: }
156
160
161
+ // --
162
+ // Thunks for final overrides do not re-dispatch, even if the override is more
163
+ // visible.
164
+ // --
165
+
166
+ // CHECK-LABEL: sil private [ossa] @$s17vtables_multifile12FinalDerivedC14privateMethod3yySiSgFAA4BaseCAD33_63E5F2521A3C787F5F9EFD57FB9237EALLyySiFTV : $@convention(method) (Int, @guaranteed FinalDerived) -> () {
167
+ // CHECK: bb0(%0 : $Int, %1 : @guaranteed $FinalDerived):
168
+ // CHECK-NEXT: [[ARG:%.*]] = enum $Optional<Int>, #Optional.some!enumelt.1, %0 : $Int // user: %4
169
+ // CHECK: [[METHOD:%.*]] = function_ref @$s17vtables_multifile12FinalDerivedC14privateMethod3yySiSgF : $@convention(method) (Optional<Int>, @guaranteed FinalDerived) -> ()
170
+ // CHECK-NEXT: apply [[METHOD]]([[ARG]], %1) : $@convention(method) (Optional<Int>, @guaranteed FinalDerived) -> ()
171
+ // CHECK-NEXT: [[RESULT:%.*]] = tuple ()
172
+ // CHECK-NEXT: return [[RESULT]] : $()
173
+ // CHECK-NEXT: }
174
+
175
+ // CHECK-LABEL: sil private [ossa] @$s17vtables_multifile12FinalDerivedC14privateMethod4yySiFAA4BaseCAD33_63E5F2521A3C787F5F9EFD57FB9237EALLyyxFTV : $@convention(method) (@in_guaranteed Int, @guaranteed FinalDerived) -> () {
176
+ // CHECK: bb0(%0 : $*Int, %1 : @guaranteed $FinalDerived):
177
+ // CHECK-NEXT: [[ARG:%.*]] = load [trivial] %0 : $*Int
178
+ // CHECK: [[METHOD:%.*]] = function_ref @$s17vtables_multifile12FinalDerivedC14privateMethod4yySiF : $@convention(method) (Int, @guaranteed FinalDerived) -> ()
179
+ // CHECK-NEXT: [[RESULT:%.*]] = apply [[METHOD]]([[ARG]], %1) : $@convention(method) (Int, @guaranteed FinalDerived) -> ()
180
+ // CHECK-NEXT: [[RESULT:%.*]] = tuple ()
181
+ // CHECK-NEXT: return [[RESULT]] : $()
182
+ // CHECK-NEXT: }
183
+
184
+
157
185
// --
158
186
// VTable for Derived.
159
187
// --
@@ -212,3 +240,16 @@ open class MostDerived : MoreDerived {
212
240
// CHECK-NEXT: #MoreDerived.privateMethod4!1: (MoreDerived) -> (Int) -> () : @$s17vtables_multifile11MostDerivedC14privateMethod4yySiF [override] // MostDerived.privateMethod4(_:)
213
241
// CHECK-NEXT: #MostDerived.deinit!deallocator.1: @$s17vtables_multifile11MostDerivedCfD // MostDerived.__deallocating_deinit
214
242
// CHECK-NEXT: }
243
+
244
+ // --
245
+ // FinalDerived adds a final override; make sure we handle this correctly.
246
+ // --
247
+
248
+ // CHECK-LABEL: sil_vtable [serialized] FinalDerived {
249
+ // CHECK-NEXT: #Base.privateMethod1!1: <T> (Base<T>) -> () -> () : @$s17vtables_multifile12FinalDerivedC14privateMethod1yyF [override] // FinalDerived.privateMethod1()
250
+ // CHECK-NEXT: #Base.privateMethod2!1: <T> (Base<T>) -> (AnyObject) -> () : @$s17vtables_multifile12FinalDerivedC14privateMethod2yyyXlSgF [override] // FinalDerived.privateMethod2(_:)
251
+ // CHECK-NEXT: #Base.privateMethod3!1: <T> (Base<T>) -> (Int) -> () : @$s17vtables_multifile12FinalDerivedC14privateMethod3yySiSgFAA4BaseCAD33_63E5F2521A3C787F5F9EFD57FB9237EALLyySiFTV [override] // vtable thunk for Base.privateMethod3(_:) dispatching to FinalDerived.privateMethod3(_:)
252
+ // CHECK-NEXT: #Base.privateMethod4!1: <T> (Base<T>) -> (T) -> () : @$s17vtables_multifile12FinalDerivedC14privateMethod4yySiFAA4BaseCAD33_63E5F2521A3C787F5F9EFD57FB9237EALLyyxFTV [override] // vtable thunk for Base.privateMethod4(_:) dispatching to FinalDerived.privateMethod4(_:)
253
+ // CHECK-NEXT: #Base.init!allocator.1: <T> (Base<T>.Type) -> () -> Base<T> : @$s17vtables_multifile12FinalDerivedCACycfC [override] // FinalDerived.__allocating_init()
254
+ // CHECK-NEXT: #FinalDerived.deinit!deallocator.1: @$s17vtables_multifile12FinalDerivedCfD // FinalDerived.__deallocating_deinit
255
+ // CHECK-NEXT: }
0 commit comments