File: method_linkage.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (134 lines) | stat: -rw-r--r-- 5,279 bytes parent folder | download
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
}