1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
// RUN: %target-swift-frontend -primary-file %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -primary-file %s -emit-ir -enable-library-evolution | %FileCheck %s --check-prefix=RESILIENT
// Test if all methods which go into a vtable have at least the visibility of its class.
// Reason: Derived classes from "outside" still have to put the less visible base members
// into their vtables.
// Method descriptors linkage:
// - internal initializer descriptor has hidden linkage when class is public:
// CHECK-LABEL: @"$s14method_linkage11PublicClassCACycfCTq" = hidden alias
// - internal initializer descriptor has hidden linkage when class is open:
// CHECK-LABEL: @"$s14method_linkage9OpenClassCACycfCTq" = hidden alias
// - private method descriptor has internal linkage even though class is open:
// CHECK: @"$s14method_linkage9OpenClassC4pfoo0{{.*}}FTq" = internal alias
class Base {
// CHECK: define hidden swiftcc void @"$s14method_linkage4Base{{.*}}3foo0
// RESILIENT: define hidden swiftcc void @"$s14method_linkage4Base{{.*}}3foo0
fileprivate func foo() {
}
// CHECK: define internal swiftcc void @"$s14method_linkage4Base{{.*}}3bar0
// RESILIENT: define internal swiftcc void @"$s14method_linkage4Base{{.*}}3bar0
fileprivate final func bar() {
}
// CHECK: define hidden swiftcc void @"$s14method_linkage4Base{{.*}}5other0
// RESILIENT: define hidden swiftcc void @"$s14method_linkage4Base{{.*}}5other0
fileprivate func other() {
}
// CHECK: define hidden swiftcc void @"$s14method_linkage4BaseC4prop{{.*}}LLytvg
// RESILIENT: define hidden swiftcc void @"$s14method_linkage4BaseC4prop{{.*}}LLytvg
fileprivate var prop: () {
return ()
}
}
class Derived : Base {
// CHECK: define hidden swiftcc void @"$s14method_linkage7Derived{{.*}}3foo0
// RESILIENT: define hidden swiftcc void @"$s14method_linkage7Derived{{.*}}3foo0
fileprivate final override func foo() {
}
// CHECK: define hidden swiftcc void @"$s14method_linkage7DerivedC4prop{{.*}}LLytvg
// RESILIENT: define hidden swiftcc void @"$s14method_linkage7DerivedC4prop{{.*}}LLytvg
fileprivate final override var prop: () {
return ()
}
}
extension Base {
// CHECK: define internal swiftcc void @"$s14method_linkage4Base{{.*}}7extfunc0
// RESILIENT: define internal swiftcc void @"$s14method_linkage4Base{{.*}}7extfunc0
fileprivate func extfunc() {
}
}
public class PublicClass {
internal init() {}
// CHECK: define hidden swiftcc void @"$s14method_linkage11PublicClass{{.*}}4pfoo0
// RESILIENT: define hidden swiftcc void @"$s14method_linkage11PublicClass{{.*}}4pfoo0
fileprivate func pfoo() {
}
// CHECK: define hidden swiftcc void @"$s14method_linkage11PublicClassC4pbaryyF
// RESILIENT: define hidden swiftcc void @"$s14method_linkage11PublicClassC4pbaryyF
internal func pbar() {
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s14method_linkage11PublicClassC4pbazyyF"
// RESILIENT: define hidden swiftcc void @"$s14method_linkage11PublicClassC4pbazyyF"
public func pbaz() {
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s14method_linkage11PublicClassC5pquuxyyF"
// RESILIENT: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s14method_linkage11PublicClassC5pquuxyyF"
public final func pquux() {
}
}
open class OpenClass {
internal init() {}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s14method_linkage9OpenClassC4pfoo0
// RESILIENT: define hidden swiftcc void @"$s14method_linkage9OpenClassC4pfoo0
fileprivate func pfoo() {
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s14method_linkage9OpenClassC4pbaryyF
// RESILIENT: define hidden swiftcc void @"$s14method_linkage9OpenClassC4pbaryyF
internal func pbar() {
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s14method_linkage9OpenClassC4pbazyyF"
// RESILIENT: define hidden swiftcc void @"$s14method_linkage9OpenClassC4pbazyyF"
public func pbaz() {
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s14method_linkage9OpenClassC5pquuxyyF"
// RESILIENT: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s14method_linkage9OpenClassC5pquuxyyF"
public final func pquux() {
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s14method_linkage9OpenClassC4prop{{.*}}LLytvg
// RESILIENT: define hidden swiftcc void @"$s14method_linkage9OpenClassC4prop{{.*}}LLytvg
fileprivate var prop: () {
return ()
}
}
open class OpenSubclass : OpenClass {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s14method_linkage12OpenSubclassC4prop{{.*}}LLytvg
// RESILIENT: define hidden swiftcc void @"$s14method_linkage12OpenSubclassC4prop{{.*}}LLytvg
fileprivate final override var prop: () {
return ()
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s14method_linkage12OpenSubclassC4pbazyyF"
// RESILIENT: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s14method_linkage12OpenSubclassC4pbazyyF"
public final override func pbaz() {}
}
// Just in case anyone wants to delete unused methods...
func callit(b: Base) {
b.foo()
b.bar()
b.other()
b.extfunc()
_ = b.prop
}
|