| // RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -primary-file %s -emit-ir | %FileCheck %s |
| |
| // 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. |
| |
| class Base { |
| // CHECK: define hidden swiftcc void @_T014method_linkage4Base{{.*}}3foo0 |
| @inline(never) |
| fileprivate func foo() { |
| } |
| |
| // CHECK: define internal swiftcc void @_T014method_linkage4Base{{.*}}3bar0 |
| @inline(never) |
| fileprivate final func bar() { |
| } |
| |
| // CHECK: define hidden swiftcc void @_T014method_linkage4Base{{.*}}5other0 |
| @inline(never) |
| fileprivate func other() { |
| } |
| } |
| class Derived : Base { |
| // CHECK: define internal swiftcc void @_T014method_linkage7Derived{{.*}}3foo0 |
| @inline(never) |
| fileprivate final override func foo() { |
| } |
| } |
| |
| extension Base { |
| // CHECK: define internal swiftcc void @_T014method_linkage4Base{{.*}}7extfunc0 |
| @inline(never) |
| fileprivate func extfunc() { |
| } |
| } |
| |
| public class PublicClass { |
| // CHECK: define hidden swiftcc void @_T014method_linkage11PublicClass{{.*}}4pfoo0 |
| @inline(never) |
| fileprivate func pfoo() { |
| } |
| |
| // CHECK: define hidden swiftcc void @_T014method_linkage11PublicClassC4pbaryyF |
| @inline(never) |
| internal func pbar() { |
| } |
| } |
| |
| open class OpenClass { |
| // CHECK: define{{( protected)?}} swiftcc void @_T014method_linkage9OpenClass{{.*}}4pfoo0 |
| @inline(never) |
| fileprivate func pfoo() { |
| } |
| |
| // CHECK: define{{( protected)?}} swiftcc void @_T014method_linkage9OpenClassC4pbaryyF |
| @inline(never) |
| internal func pbar() { |
| } |
| } |
| |
| // Just in case anyone wants to delete unused methods... |
| func callit(b: Base, p: PublicClass) { |
| b.foo() |
| b.bar() |
| b.other() |
| b.extfunc() |
| p.pfoo() |
| p.pbar() |
| } |
| |