|
| 1 | +// RUN: %target-swift-frontend -sdk %S/Inputs -emit-silgen -I %S/Inputs -enable-source-import %s -disable-objc-attr-requires-foundation-module | %FileCheck %s |
| 2 | + |
| 3 | +// REQUIRES: objc_interop |
| 4 | + |
| 5 | +import gizmo |
| 6 | + |
| 7 | +// Test ObjC base class |
| 8 | + |
| 9 | +class Hoozit : Gizmo { |
| 10 | + // Overrides Gizmo.frob |
| 11 | + override func frob() {} |
| 12 | + |
| 13 | + // Overrides Gizmo.funge |
| 14 | + override func funge() {} |
| 15 | + |
| 16 | + // Overrides Gizmo.foo |
| 17 | + final override func foo() {} |
| 18 | + |
| 19 | + func anse() {} |
| 20 | + func incorrige() {} |
| 21 | +} |
| 22 | + |
| 23 | +// CHECK-LABEL: sil hidden @_T012vtables_objc10callHoozityAA0D0CF : $@convention(thin) (@owned Hoozit) -> () |
| 24 | +func callHoozit(_ h: Hoozit) { |
| 25 | + // CHECK: class_method [volatile] {{.*}} : $Hoozit, #Hoozit.frob!1.foreign |
| 26 | + h.frob() |
| 27 | + // CHECK: function_ref @_T012vtables_objc6HoozitC3fooyyF |
| 28 | + h.foo() |
| 29 | + // CHECK: class_method {{.*}} : $Hoozit, #Hoozit.anse!1 |
| 30 | + h.anse() |
| 31 | + // CHECK: return |
| 32 | +} |
| 33 | + |
| 34 | +class Wotsit : Hoozit { |
| 35 | + // Overrides Gizmo.funge |
| 36 | + override func funge() {} |
| 37 | + |
| 38 | + // Overrides Hoozit.incorrige |
| 39 | + override func incorrige() {} |
| 40 | + |
| 41 | + // Overrides Gizmo.frob |
| 42 | + final override func frob() {} |
| 43 | +} |
| 44 | + |
| 45 | +// CHECK-LABEL: sil hidden @_T012vtables_objc10callWotsityAA0D0CF : $@convention(thin) (@owned Wotsit) -> () |
| 46 | +func callWotsit(_ w: Wotsit) { |
| 47 | + // CHECK: class_method [volatile] {{.*}} : $Wotsit, #Wotsit.funge!1.foreign |
| 48 | + w.funge() |
| 49 | + // CHECK: class_method {{.*}} : $Wotsit, #Wotsit.incorrige!1 |
| 50 | + w.incorrige() |
| 51 | + // CHECK: function_ref @_T012vtables_objc6WotsitC4frobyyF |
| 52 | + w.frob() |
| 53 | + // CHECK: return |
| 54 | +} |
| 55 | + |
| 56 | +// Entries only exist for native Swift methods |
| 57 | + |
| 58 | +// CHECK: sil_vtable Hoozit { |
| 59 | +// CHECK-NEXT: #Hoozit.anse!1: {{.*}} : _T012vtables_objc6HoozitC4anse{{[_0-9a-zA-Z]*}}F |
| 60 | +// CHECK-NEXT: #Hoozit.incorrige!1: {{.*}} : _T012vtables_objc6HoozitC9incorrige{{[_0-9a-zA-Z]*}}F |
| 61 | +// CHECK-NEXT: #Hoozit.init!initializer.1: (Hoozit.Type) -> () -> Hoozit! : _T012vtables_objc6HoozitCSQyACGycfc |
| 62 | +// CHECK-NEXT: #Hoozit.init!initializer.1: (Hoozit.Type) -> (Int) -> Hoozit! : _T012vtables_objc6HoozitCSQyACGSi7bellsOn_tcfc |
| 63 | +// CHECK-NEXT: #Hoozit.deinit!deallocator: _T012vtables_objc6HoozitCfD |
| 64 | +// CHECK-NEXT: } |
| 65 | + |
| 66 | +// CHECK: sil_vtable Wotsit { |
| 67 | +// CHECK-NEXT: #Hoozit.anse!1: {{.*}} : _T012vtables_objc6HoozitC4anse{{[_0-9a-zA-Z]*}}F |
| 68 | +// CHECK-NEXT: #Hoozit.incorrige!1: {{.*}} : _T012vtables_objc6WotsitC9incorrige{{[_0-9a-zA-Z]*}}F |
| 69 | +// CHECK-NEXT: #Hoozit.init!initializer.1: (Hoozit.Type) -> () -> Hoozit! : _T012vtables_objc6WotsitCSQyACGycfc |
| 70 | +// CHECK-NEXT: #Hoozit.init!initializer.1: (Hoozit.Type) -> (Int) -> Hoozit! : _T012vtables_objc6WotsitCSQyACGSi7bellsOn_tcfc |
| 71 | +// CHECK-NEXT: #Wotsit.deinit!deallocator: _T012vtables_objc6WotsitCfD |
| 72 | +// CHECK-NEXT: } |
| 73 | + |
| 74 | +// <rdar://problem/15282548> |
| 75 | +// CHECK: sil_vtable Base { |
| 76 | +// CHECK: #Base.init!initializer.1: {{.*}} : _T012vtables_objc4BaseC{{[_0-9a-zA-Z]*}}fc |
| 77 | +// CHECK: } |
| 78 | +// CHECK: sil_vtable Derived { |
| 79 | +// CHECK: #Base.init!initializer.1: {{.*}} : _T012vtables_objc7DerivedC{{[_0-9a-zA-Z]*}}fc |
| 80 | +// CHECK: } |
| 81 | +@objc class Base {} |
| 82 | + |
| 83 | +extension Base { |
| 84 | + // note: does not have a vtable slot, because it is from an extension |
| 85 | + func identify() -> Int { |
| 86 | + return 0 |
| 87 | + } |
| 88 | +} |
| 89 | + |
| 90 | +class Derived : Base { |
| 91 | + override func identify() -> Int { |
| 92 | + return 1 |
| 93 | + } |
| 94 | +} |
0 commit comments