@@ -103,6 +103,17 @@ func metatypeCanBeDynamicallyCast(original: Int.Type,
103
103
expectTrue(original == bridged as! Int.Type)
104
104
expectTrue(original == bridged as! Any.Type)
105
105
}
106
+ func metatypeCanBeDynamicallyCast(original: CFString.Type,
107
+ bridged: AnyObject) {
108
+ expectTrue(original == bridged as! CFString.Type)
109
+ expectTrue(original == bridged as! Any.Type)
110
+ }
111
+ func metatypeCanBeDynamicallyCastGenerically<T>(original: T.Type,
112
+ bridged: AnyObject) {
113
+ expectTrue(original == bridged as! T.Type)
114
+ expectTrue(original == bridged as! Any.Type)
115
+ }
116
+
106
117
107
118
func guineaPigFunction() -> Int {
108
119
return 1738
@@ -114,17 +125,49 @@ func functionCanBeDynamicallyCast(original: () -> Int,
114
125
expectEqual(original(), try! (bridged as! () throws -> Int)())
115
126
}
116
127
128
+ func classMetatypePreservesIdentity<T: AnyObject>(original: T.Type,
129
+ bridged: AnyObject) {
130
+ expectTrue(original as AnyObject === bridged)
131
+ expectTrue(original as AnyObject.Type as AnyObject === bridged)
132
+ expectTrue(original as Any.Type as AnyObject === bridged)
133
+ }
134
+
135
+ func classMetatypePreservesIdentityGenerically<T>(original: T.Type,
136
+ bridged: AnyObject) {
137
+ expectTrue(original as AnyObject === bridged)
138
+ expectTrue(original as Any.Type as AnyObject === bridged)
139
+ }
140
+
141
+ func protocolObjectPreservesIdentity(original: NSCopying.Protocol,
142
+ bridged: AnyObject) {
143
+ let proto: Protocol = original
144
+ expectTrue(proto === bridged)
145
+ }
146
+
147
+ protocol P {}
148
+
117
149
// We want to exhaustively check all paths through the bridging and dynamic
118
150
// casting infrastructure, so expand out test cases that wrap the different
119
151
// interesting bridging cases in different kinds of existential container.
120
152
%{
121
153
testCases = [
122
- ("classes", "LifetimeTracked(0)", "bridgedObjectPreservesIdentity", True),
123
- ("strings", '"vitameatavegamin"', "stringBridgesToEqualNSString", True),
124
- ("unbridged type", "KnownUnbridged()", "boxedTypeRoundTripsThroughDynamicCasting", True),
125
- ("tuple", '(1, "2")', "tupleCanBeDynamicallyCast", False),
126
- ("metatype", 'Int.self', "metatypeCanBeDynamicallyCast", False),
127
- ("function", 'guineaPigFunction', "functionCanBeDynamicallyCast", False),
154
+ ("classes", "LifetimeTracked(0)", "bridgedObjectPreservesIdentity", True),
155
+ ("strings", '"vitameatavegamin"', "stringBridgesToEqualNSString", True),
156
+ ("unbridged type", "KnownUnbridged()", "boxedTypeRoundTripsThroughDynamicCasting", True),
157
+ ("tuple", '(1, "2")', "tupleCanBeDynamicallyCast", False),
158
+ ("metatype", 'Int.self', "metatypeCanBeDynamicallyCast", False),
159
+ ("generic metatype", 'Int.self', "metatypeCanBeDynamicallyCastGenerically", False),
160
+ ("CF metatype", 'CFString.self', "metatypeCanBeDynamicallyCast", False),
161
+ ("generic CF metatype", 'CFString.self', "metatypeCanBeDynamicallyCastGenerically", False),
162
+ ("class metatype", 'LifetimeTracked.self', "classMetatypePreservesIdentity", False),
163
+ ("objc metatype", 'NSObject.self', "classMetatypePreservesIdentity", False),
164
+ ("protocol", 'P.self', "metatypeCanBeDynamicallyCastGenerically", False),
165
+ ("objc protocol", 'NSCopying.self', "protocolObjectPreservesIdentity", False),
166
+ ("objc protocol composition", '(NSCopying & NSCoding).self', "metatypeCanBeDynamicallyCastGenerically", False),
167
+ ("mixed protocol composition", '(NSCopying & P).self', "metatypeCanBeDynamicallyCastGenerically", False),
168
+ ("generic class metatype", 'LifetimeTracked.self', "classMetatypePreservesIdentityGenerically", False),
169
+ ("generic objc metatype", 'NSObject.self', "classMetatypePreservesIdentityGenerically", False),
170
+ ("function", 'guineaPigFunction', "functionCanBeDynamicallyCast", False),
128
171
]
129
172
}%
130
173
0 commit comments