Skip to content

Commit c7d4bd9

Browse files
committed
Add resilience tests
1 parent 1d8faf6 commit c7d4bd9

File tree

4 files changed

+130
-0
lines changed

4 files changed

+130
-0
lines changed

test/IRGen/struct_resilience.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,24 @@ public func partialApplyOfResilientMethod(s: Size) {
170170
_ = s.method
171171
}
172172

173+
public func wantsAny(_ any: Any) {}
174+
175+
public func resilientAny(s : ResilientWeakRef) {
176+
wantsAny(s)
177+
}
178+
179+
// CHECK-LABEL: define{{.*}} swiftcc void @"$S17struct_resilience12resilientAny1sy0c1_A016ResilientWeakRefV_tF"(%swift.opaque* noalias nocapture)
180+
// CHECK: entry:
181+
// CHECK: [[ANY:%.*]] = alloca %Any
182+
// CHECK: [[META:%.*]] = call swiftcc %swift.metadata_response @"$S16resilient_struct16ResilientWeakRefVMa"(i64 0)
183+
// CHECK: [[META2:%.*]] = extractvalue %swift.metadata_response %3, 0
184+
// CHECK: [[TYADDR:%.*]] = getelementptr inbounds %Any, %Any* %1, i32 0, i32 1
185+
// CHECK: store %swift.type* [[META2]], %swift.type** [[TYADDR]]
186+
// CHECK: call %swift.opaque* @__swift_allocate_boxed_opaque_existential_0(%Any* [[ANY]])
187+
// CHECK: call swiftcc void @"$S17struct_resilience8wantsAnyyyypF"(%Any* noalias nocapture dereferenceable(32) [[ANY]])
188+
// CHECK: call void @__swift_destroy_boxed_opaque_existential_0(%Any* [[ANY]])
189+
// CHECK: ret void
190+
173191
// Public metadata accessor for our resilient struct
174192

175193
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$S17struct_resilience6MySizeVMa"

test/Inputs/resilient_struct.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,13 @@ public struct ResilientDouble {
7777
self.d = d
7878
}
7979
}
80+
81+
public class Referent {}
82+
83+
public struct ResilientWeakRef {
84+
public weak var ref: Referent?
85+
86+
public init (_ r: Referent) {
87+
ref = r
88+
}
89+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
public protocol Reporter {
2+
func report() -> String;
3+
}
4+
public class Subject {
5+
public var value = 1
6+
public init(_ v: Int) {
7+
value = v
8+
}
9+
}
10+
public var s2 = Subject(2)
11+
public var s3 = Subject(3)
12+
public var s4 = Subject(4)
13+
public var s5 = Subject(5)
14+
15+
public struct Container : Reporter {
16+
#if BEFORE
17+
public var v : Subject
18+
#else
19+
weak public var v : Subject?
20+
#endif
21+
public init(_ s: Subject) {
22+
v = s
23+
}
24+
25+
public func report() -> String{
26+
#if BEFORE
27+
return "Container(\(v.value))"
28+
#else
29+
return "Container(\(v!.value))"
30+
#endif
31+
}
32+
}
33+
public func createContainerReporter() -> Reporter {
34+
return Container(s2)
35+
}
36+
37+
public struct PairContainer: Reporter {
38+
public var pair : (Container, Container)
39+
40+
public init(_ p : (Container, Container)) {
41+
pair = p
42+
}
43+
44+
public func report() -> String {
45+
return "PairContainer(\(pair.0.report()), \(pair.1.report()))"
46+
}
47+
}
48+
49+
public func createPairContainerReporter() -> Reporter {
50+
return PairContainer((Container(s3), Container(s4)))
51+
}
52+
53+
public enum EnumContainer : Reporter {
54+
case Empty
55+
case Some(Container)
56+
57+
public func report() -> String {
58+
switch self {
59+
case .Empty:
60+
return "EnumContainer Empty"
61+
case .Some(let c):
62+
return "EnumContainer(\(c.report()))"
63+
}
64+
}
65+
}
66+
67+
public func createEnumContainerReporter() -> Reporter {
68+
return EnumContainer.Some(Container(s5))
69+
}
70+
71+
public func report(_ r: Reporter) -> String {
72+
return r.report()
73+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// RUN: %target-resilience-test
2+
// REQUIRES: executable_test
3+
4+
import StdlibUnittest
5+
import bitwise_takable
6+
7+
8+
var BitwiseTakable = TestSuite("BitwiseTakable")
9+
10+
BitwiseTakable.test("test") {
11+
let c = createContainerReporter()
12+
expectEqual("Container(2)", c.report())
13+
let p = createPairContainerReporter()
14+
expectEqual("PairContainer(Container(3), Container(4))", p.report())
15+
let e = createEnumContainerReporter()
16+
expectEqual("EnumContainer(Container(5))", e.report())
17+
18+
let r : Reporter = Container(s2)
19+
expectEqual("Container(2)", report(r))
20+
21+
let r2 : Reporter = PairContainer((Container(s3), Container(s4)))
22+
expectEqual("PairContainer(Container(3), Container(4))", report(r2))
23+
24+
let r3 : Reporter = EnumContainer.Some(Container(s5))
25+
expectEqual("EnumContainer(Container(5))", report(r3))
26+
27+
}
28+
29+
runAllTests()

0 commit comments

Comments
 (0)