forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdynamic_self.swift
98 lines (82 loc) · 1.81 KB
/
dynamic_self.swift
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
// RUN: %target-run-simple-swift | FileCheck %s
// REQUIRES: executable_test
// Test IR generation via execution for Self.
protocol P {
func f() -> Self
func g() -> Self
}
protocol CP : class {
func f() -> Self
func g() -> Self
}
func callDynamicSelfExistential(p: P) {
print("Before first call")
var p2 = p.f()
print("Between calls")
p2.g()
print("After second call")
}
func callDynamicSelfClassExistential(cp: CP) {
print("Before first call")
var cp2 = cp.f()
print("Between calls")
cp2.g()
print("After second call")
}
struct S : P {
func f() -> S {
print("S.f()")
return self
}
func g() -> S {
print("S.g()")
return self
}
}
class C : P, CP {
init() {
print("Allocating C")
}
deinit {
print("Destroying C")
}
func f() -> Self {
print("C.f()")
return self
}
func g() -> Self {
print("C.g()")
return self
}
}
print("-------------------------------")
// CHECK: S() as non-class existential
print("S() as non-class existential")
// CHECK-NEXT: Before first call
// CHECK-NEXT: S.f()
// CHECK-NEXT: Between calls
// CHECK-NEXT: S.g()
// CHECK-NEXT: After second call
callDynamicSelfExistential(S())
// CHECK-NEXT: C() as non-class existential
print("C() as non-class existential")
// CHECK-NEXT: Allocating C
// CHECK-NEXT: Before first call
// CHECK-NEXT: C.f()
// CHECK-NEXT: Between calls
// CHECK-NEXT: C.g()
// CHECK-NEXT: After second call
// CHECK-NEXT: Destroying C
callDynamicSelfExistential(C())
// CHECK-NEXT: C() as class existential
print("C() as class existential")
// CHECK-NEXT: Allocating C
// CHECK-NEXT: Before first call
// CHECK-NEXT: C.f()
// CHECK-NEXT: Between calls
// CHECK-NEXT: C.g()
// CHECK-NEXT: After second call
// CHECK-NEXT: Destroying C
callDynamicSelfClassExistential(C())
// CHECK-NEXT: Done
print("Done")