|
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