|
32 | 32 | // Because of the use of 'sed' in this test.
|
33 | 33 | // REQUIRES: shell
|
34 | 34 |
|
35 |
| -// rdar://133393259 fails in optimized tests. |
36 |
| -// UNSUPPORTED: swift_test_mode_optimize |
37 |
| -// UNSUPPORTED: swift_test_mode_optimize_size |
38 |
| - |
39 | 35 | import Darwin
|
40 | 36 | import Foundation
|
41 | 37 |
|
@@ -141,71 +137,79 @@ func check(base: Int = 0, sub: Int = 0,
|
141 | 137 | }
|
142 | 138 |
|
143 | 139 |
|
144 |
| -// CHECK: START |
145 |
| -print("START") |
146 |
| - |
147 |
| -// Check that this whole setup works. |
148 |
| -// CHECK-NEXT: init(swift:) Base |
149 |
| -check(base: 1) { Base(swift: ()) } |
150 |
| -// CHECK-NEXT: init(swift:) Sub |
151 |
| -check(sub: 1) { Sub(swift: ()) } |
152 |
| -// CHECK-NEXT: init(objc:) Base |
153 |
| -check(base: 1) { Base(objc: ()) } |
154 |
| -// CHECK-NEXT: init(objc:) Sub |
155 |
| -check(sub: 1) { Sub(objc: ()) } |
156 |
| - |
157 |
| -// CHECK-NEXT: init(swiftToSwift:) Sub |
158 |
| -// CHECK-NEXT: init(swift:) Sub |
159 |
| -check(sub: 1) { Sub(swiftToSwift: ()) } |
160 |
| -// CHECK-NEXT: init(objcToSwift:) Sub |
161 |
| -// CHECK-NEXT: init(swift:) Sub |
162 |
| -check(sub: 2) { Sub(objcToSwift: ()) } |
163 |
| -// CHECK-NEXT: init(swiftToObjC:) Sub |
164 |
| -// CHECK-NEXT: init(objc:) Sub |
165 |
| -check(sub: 1) { Sub(swiftToObjC: ()) } |
166 |
| -// CHECK-NEXT: init(objcToObjC:) Sub |
167 |
| -// CHECK-NEXT: init(objc:) Sub |
168 |
| -check(sub: 1) { Sub(objcToObjC: ()) } |
169 |
| - |
170 |
| -// CHECK-NEXT: init(swiftToSwiftConvenience:) Sub |
171 |
| -// CHECK-NEXT: init(swiftToSwift:) Sub |
172 |
| -// CHECK-NEXT: init(swift:) Sub |
173 |
| -check(sub: 1) { Sub(swiftToSwiftConvenience: ()) } |
174 |
| -// CHECK-NEXT: init(objcToSwiftConvenience:) Sub |
175 |
| -// CHECK-NEXT: init(swiftToSwift:) Sub |
176 |
| -// CHECK-NEXT: init(swift:) Sub |
177 |
| -check(sub: 2) { Sub(objcToSwiftConvenience: ()) } |
178 |
| -// CHECK-NEXT: init(swiftToObjCConvenience:) Sub |
179 |
| -// CHECK-NEXT: init(objcToObjC:) Sub |
180 |
| -// CHECK-NEXT: init(objc:) Sub |
181 |
| -check(sub: 1) { Sub(swiftToObjCConvenience: ()) } |
182 |
| -// CHECK-NEXT: init(objcToObjCConvenience:) Sub |
183 |
| -// CHECK-NEXT: init(objcToObjC:) Sub |
184 |
| -// CHECK-NEXT: init(objc:) Sub |
185 |
| -check(sub: 1) { Sub(objcToObjCConvenience: ()) } |
186 |
| - |
187 |
| -// Force ObjC dispatch without conforming Sub or Base to the protocol, |
188 |
| -// because it's possible that `required` perturbs things and we want to test |
189 |
| -// both ways. |
190 |
| -let SubAsObjC = unsafeBitCast(Sub.self as AnyObject, |
191 |
| - to: ForceObjCDispatch.Type.self) |
192 |
| - |
193 |
| -// CHECK-NEXT: init(objc:) Sub |
194 |
| -check(sub: 1) { SubAsObjC.init(objc: ()) } |
195 |
| -// CHECK-NEXT: init(objcToSwift:) Sub |
196 |
| -// CHECK-NEXT: init(swift:) Sub |
197 |
| -check(sub: 2) { SubAsObjC.init(objcToSwift: ()) } |
198 |
| -// CHECK-NEXT: init(objcToObjC:) Sub |
199 |
| -// CHECK-NEXT: init(objc:) Sub |
200 |
| -check(sub: 1) { SubAsObjC.init(objcToObjC: ()) } |
201 |
| -// CHECK-NEXT: init(objcToSwiftConvenience:) Sub |
202 |
| -// CHECK-NEXT: init(swiftToSwift:) Sub |
203 |
| -// CHECK-NEXT: init(swift:) Sub |
204 |
| -check(sub: 2) { SubAsObjC.init(objcToSwiftConvenience: ()) } |
205 |
| -// CHECK-NEXT: init(objcToObjCConvenience:) Sub |
206 |
| -// CHECK-NEXT: init(objcToObjC:) Sub |
207 |
| -// CHECK-NEXT: init(objc:) Sub |
208 |
| -check(sub: 1) { SubAsObjC.init(objcToObjCConvenience: ()) } |
209 |
| - |
210 |
| -// CHECK-NEXT: END |
211 |
| -print("END") |
| 140 | +// Specialization of the 'check' function may result in the closure being deleted, which breaks the test. Disabling |
| 141 | +// optimization of this calling function prevents closure specialization. |
| 142 | +@_optimize(none) |
| 143 | +func main() { |
| 144 | + // CHECK: START |
| 145 | + print("START") |
| 146 | + |
| 147 | + // Check that this whole setup works. |
| 148 | + // CHECK-NEXT: init(swift:) Base |
| 149 | + check(base: 1) { Base(swift: ()) } |
| 150 | + // CHECK-NEXT: init(swift:) Sub |
| 151 | + check(sub: 1) { Sub(swift: ()) } |
| 152 | + // CHECK-NEXT: init(objc:) Base |
| 153 | + check(base: 1) { Base(objc: ()) } |
| 154 | + // CHECK-NEXT: init(objc:) Sub |
| 155 | + check(sub: 1) { Sub(objc: ()) } |
| 156 | + |
| 157 | + // CHECK-NEXT: init(swiftToSwift:) Sub |
| 158 | + // CHECK-NEXT: init(swift:) Sub |
| 159 | + check(sub: 1) { Sub(swiftToSwift: ()) } |
| 160 | + // CHECK-NEXT: init(objcToSwift:) Sub |
| 161 | + // CHECK-NEXT: init(swift:) Sub |
| 162 | + check(sub: 2) { Sub(objcToSwift: ()) } |
| 163 | + // CHECK-NEXT: init(swiftToObjC:) Sub |
| 164 | + // CHECK-NEXT: init(objc:) Sub |
| 165 | + check(sub: 1) { Sub(swiftToObjC: ()) } |
| 166 | + // CHECK-NEXT: init(objcToObjC:) Sub |
| 167 | + // CHECK-NEXT: init(objc:) Sub |
| 168 | + check(sub: 1) { Sub(objcToObjC: ()) } |
| 169 | + |
| 170 | + // CHECK-NEXT: init(swiftToSwiftConvenience:) Sub |
| 171 | + // CHECK-NEXT: init(swiftToSwift:) Sub |
| 172 | + // CHECK-NEXT: init(swift:) Sub |
| 173 | + check(sub: 1) { Sub(swiftToSwiftConvenience: ()) } |
| 174 | + // CHECK-NEXT: init(objcToSwiftConvenience:) Sub |
| 175 | + // CHECK-NEXT: init(swiftToSwift:) Sub |
| 176 | + // CHECK-NEXT: init(swift:) Sub |
| 177 | + check(sub: 2) { Sub(objcToSwiftConvenience: ()) } |
| 178 | + // CHECK-NEXT: init(swiftToObjCConvenience:) Sub |
| 179 | + // CHECK-NEXT: init(objcToObjC:) Sub |
| 180 | + // CHECK-NEXT: init(objc:) Sub |
| 181 | + check(sub: 1) { Sub(swiftToObjCConvenience: ()) } |
| 182 | + // CHECK-NEXT: init(objcToObjCConvenience:) Sub |
| 183 | + // CHECK-NEXT: init(objcToObjC:) Sub |
| 184 | + // CHECK-NEXT: init(objc:) Sub |
| 185 | + check(sub: 1) { Sub(objcToObjCConvenience: ()) } |
| 186 | + |
| 187 | + // Force ObjC dispatch without conforming Sub or Base to the protocol, |
| 188 | + // because it's possible that `required` perturbs things and we want to test |
| 189 | + // both ways. |
| 190 | + let SubAsObjC = unsafeBitCast(Sub.self as AnyObject, |
| 191 | + to: ForceObjCDispatch.Type.self) |
| 192 | + |
| 193 | + // CHECK-NEXT: init(objc:) Sub |
| 194 | + check(sub: 1) { SubAsObjC.init(objc: ()) } |
| 195 | + // CHECK-NEXT: init(objcToSwift:) Sub |
| 196 | + // CHECK-NEXT: init(swift:) Sub |
| 197 | + check(sub: 2) { SubAsObjC.init(objcToSwift: ()) } |
| 198 | + // CHECK-NEXT: init(objcToObjC:) Sub |
| 199 | + // CHECK-NEXT: init(objc:) Sub |
| 200 | + check(sub: 1) { SubAsObjC.init(objcToObjC: ()) } |
| 201 | + // CHECK-NEXT: init(objcToSwiftConvenience:) Sub |
| 202 | + // CHECK-NEXT: init(swiftToSwift:) Sub |
| 203 | + // CHECK-NEXT: init(swift:) Sub |
| 204 | + check(sub: 2) { SubAsObjC.init(objcToSwiftConvenience: ()) } |
| 205 | + // CHECK-NEXT: init(objcToObjCConvenience:) Sub |
| 206 | + // CHECK-NEXT: init(objcToObjC:) Sub |
| 207 | + // CHECK-NEXT: init(objc:) Sub |
| 208 | + check(sub: 1) { SubAsObjC.init(objcToObjCConvenience: ()) } |
| 209 | + |
| 210 | + // CHECK-NEXT: END |
| 211 | + print("END") |
| 212 | +} |
| 213 | + |
| 214 | +main() |
| 215 | + |
0 commit comments