@@ -18,6 +18,15 @@ enum E : Error {
18
18
case X
19
19
}
20
20
21
+ class Klass { }
22
+
23
+ func mustThrow< T> ( _ f: ( ) throws -> T ) {
24
+ do {
25
+ try f ( )
26
+ preconditionFailure ( " Didn't throw " )
27
+ } catch { }
28
+ }
29
+
21
30
func unwrap( _ b: Bool ) throws -> Int {
22
31
if b {
23
32
throw E . X
@@ -190,13 +199,6 @@ class GuineaPig<T> : Bear {
190
199
}
191
200
}
192
201
193
- func mustThrow< T> ( _ f: ( ) throws -> T ) {
194
- do {
195
- try f ( )
196
- preconditionFailure ( " Didn't throw " )
197
- } catch { }
198
- }
199
-
200
202
ThrowingInitTestSuite . test ( " DesignatedInitSuccess_Root " ) {
201
203
_ = try ! Bear ( n: 0 , before: false )
202
204
_ = try ! Bear ( n: 0 , after: false )
@@ -324,6 +326,279 @@ ThrowingInitTestSuite.test("ConvenienceInitFailure_Derived") {
324
326
expectEqual ( NSLifetimeTracked . count ( ) , 0 )
325
327
}
326
328
329
+ // @objc tests
330
+
331
+ class ObjCAnnotatedBear : NSLifetimeTracked {
332
+ let x : LifetimeTracked
333
+
334
+ /* Designated */
335
+ @objc init ( n: Int ) {
336
+ x = LifetimeTracked ( 0 )
337
+ }
338
+
339
+ @objc init ( n: Int , before: Bool ) throws {
340
+ if before {
341
+ throw E . X
342
+ }
343
+ self . x = LifetimeTracked ( 0 )
344
+ }
345
+
346
+ @objc init ( n: Int , after: Bool ) throws {
347
+ self . x = LifetimeTracked ( 0 )
348
+ if after {
349
+ throw E . X
350
+ }
351
+ }
352
+
353
+ @objc init ( n: Int , before: Bool , after: Bool ) throws {
354
+ if before {
355
+ throw E . X
356
+ }
357
+ self . x = LifetimeTracked ( 0 )
358
+ if after {
359
+ throw E . X
360
+ }
361
+ }
362
+
363
+ /* Convenience */
364
+ @objc convenience init ( before: Bool ) throws {
365
+ try unwrap ( before)
366
+ self . init ( n: 0 )
367
+ }
368
+
369
+ @objc convenience init ( before2: Bool ) throws {
370
+ try self . init ( n: unwrap ( before2) )
371
+ }
372
+
373
+ @objc convenience init ( before: Bool , before2: Bool ) throws {
374
+ try unwrap ( before)
375
+ try self . init ( n: unwrap ( before2) )
376
+ }
377
+
378
+ @objc convenience init ( during: Bool ) throws {
379
+ try self . init ( n: 0 , after: during)
380
+ }
381
+
382
+ @objc convenience init ( before: Bool , during: Bool ) throws {
383
+ try unwrap ( before)
384
+ try self . init ( n: 0 , after: during)
385
+ }
386
+
387
+ @objc convenience init ( after: Bool ) throws {
388
+ self . init ( n: 0 )
389
+ try unwrap ( after)
390
+ }
391
+
392
+ @objc convenience init ( before: Bool , after: Bool ) throws {
393
+ try unwrap ( before)
394
+ self . init ( n: 0 )
395
+ try unwrap ( after)
396
+ }
397
+
398
+ @objc convenience init ( during: Bool , after: Bool ) throws {
399
+ try self . init ( n: 0 , after: during)
400
+ try unwrap ( after)
401
+ }
402
+
403
+ @objc convenience init ( before: Bool , during: Bool , after: Bool ) throws {
404
+ try unwrap ( before)
405
+ try self . init ( n: 0 , after: during)
406
+ try unwrap ( after)
407
+ }
408
+
409
+ @objc convenience init ( before: Bool , before2: Bool , during: Bool , after: Bool ) throws {
410
+ try unwrap ( before)
411
+ try self . init ( n: unwrap ( before2) , after: during)
412
+ try unwrap ( after)
413
+ }
414
+ }
415
+
416
+ class ObjCAnnotatedPolarBear : ObjCAnnotatedBear {
417
+ let y : LifetimeTracked
418
+
419
+ /* Designated */
420
+ @objc override init ( n: Int ) {
421
+ self . y = LifetimeTracked ( 0 )
422
+ super. init ( n: n)
423
+ }
424
+
425
+ @objc override init ( n: Int , before: Bool ) throws {
426
+ if before {
427
+ throw E . X
428
+ }
429
+ self . y = LifetimeTracked ( 0 )
430
+ super. init ( n: n)
431
+ }
432
+
433
+ @objc init ( n: Int , during: Bool ) throws {
434
+ self . y = LifetimeTracked ( 0 )
435
+ try super. init ( n: n, before: during)
436
+ }
437
+
438
+ @objc init ( n: Int , before: Bool , during: Bool ) throws {
439
+ self . y = LifetimeTracked ( 0 )
440
+ if before {
441
+ throw E . X
442
+ }
443
+ try super. init ( n: n, before: during)
444
+ }
445
+
446
+ @objc override init ( n: Int , after: Bool ) throws {
447
+ self . y = LifetimeTracked ( 0 )
448
+ super. init ( n: n)
449
+ if after {
450
+ throw E . X
451
+ }
452
+ }
453
+
454
+ @objc init ( n: Int , during: Bool , after: Bool ) throws {
455
+ self . y = LifetimeTracked ( 0 )
456
+ try super. init ( n: n, before: during)
457
+ if after {
458
+ throw E . X
459
+ }
460
+ }
461
+
462
+ @objc override init ( n: Int , before: Bool , after: Bool ) throws {
463
+ if before {
464
+ throw E . X
465
+ }
466
+ self . y = LifetimeTracked ( 0 )
467
+ super. init ( n: n)
468
+ if after {
469
+ throw E . X
470
+ }
471
+ }
472
+
473
+ @objc init ( n: Int , before: Bool , during: Bool , after: Bool ) throws {
474
+ if before {
475
+ throw E . X
476
+ }
477
+ self . y = LifetimeTracked ( 0 )
478
+ try super. init ( n: n, before: during)
479
+ if after {
480
+ throw E . X
481
+ }
482
+ }
483
+ }
484
+
485
+ ThrowingInitTestSuite . test ( " ObjCAnnotatedDesignatedInitSuccess_Root " ) {
486
+ _ = try ! ObjCAnnotatedBear ( n: 0 , before: false )
487
+ _ = try ! ObjCAnnotatedBear ( n: 0 , after: false )
488
+ _ = try ! ObjCAnnotatedBear ( n: 0 , before: false , after: false )
489
+ _ = try ! ObjCAnnotatedBear ( n: 0 , before: false , after: false )
490
+ expectEqual ( NSLifetimeTracked . count ( ) , 0 )
491
+ }
492
+
493
+ ThrowingInitTestSuite . test ( " ObjCAnnotatedDesignatedInitFailure_Root " ) {
494
+ mustThrow { try ObjCAnnotatedBear ( n: 0 , before: true ) }
495
+ mustThrow { try ObjCAnnotatedBear ( n: 0 , after: true ) }
496
+ mustThrow { try ObjCAnnotatedBear ( n: 0 , before: true , after: false ) }
497
+ mustThrow { try ObjCAnnotatedBear ( n: 0 , before: false , after: true ) }
498
+ expectEqual ( NSLifetimeTracked . count ( ) , 0 )
499
+ }
500
+
501
+ ThrowingInitTestSuite . test ( " ObjCAnnotatedDesignatedInitSuccess_Derived " ) {
502
+ _ = try ! ObjCAnnotatedPolarBear ( n: 0 , before: false )
503
+ _ = try ! ObjCAnnotatedPolarBear ( n: 0 , during: false )
504
+ _ = try ! ObjCAnnotatedPolarBear ( n: 0 , before: false , during: false )
505
+ _ = try ! ObjCAnnotatedPolarBear ( n: 0 , after: false )
506
+ _ = try ! ObjCAnnotatedPolarBear ( n: 0 , during: false , after: false )
507
+ _ = try ! ObjCAnnotatedPolarBear ( n: 0 , before: false , after: false )
508
+ _ = try ! ObjCAnnotatedPolarBear ( n: 0 , before: false , during: false , after: false )
509
+ expectEqual ( NSLifetimeTracked . count ( ) , 0 )
510
+ }
511
+
512
+ ThrowingInitTestSuite . test ( " ObjCAnnotatedDesignatedInitFailure_Derived " ) {
513
+ mustThrow { try ObjCAnnotatedPolarBear ( n: 0 , before: true ) }
514
+ mustThrow { try ObjCAnnotatedPolarBear ( n: 0 , during: true ) }
515
+ mustThrow { try ObjCAnnotatedPolarBear ( n: 0 , before: true , during: false ) }
516
+ mustThrow { try ObjCAnnotatedPolarBear ( n: 0 , before: false , during: true ) }
517
+ mustThrow { try ObjCAnnotatedPolarBear ( n: 0 , after: true ) }
518
+ mustThrow { try ObjCAnnotatedPolarBear ( n: 0 , during: true , after: false ) }
519
+ mustThrow { try ObjCAnnotatedPolarBear ( n: 0 , during: false , after: true ) }
520
+ mustThrow { try ObjCAnnotatedPolarBear ( n: 0 , before: true , after: false ) }
521
+ mustThrow { try ObjCAnnotatedPolarBear ( n: 0 , before: false , after: true ) }
522
+ mustThrow { try ObjCAnnotatedPolarBear ( n: 0 , before: true , during: false , after: false ) }
523
+ mustThrow { try ObjCAnnotatedPolarBear ( n: 0 , before: false , during: true , after: false ) }
524
+ mustThrow { try ObjCAnnotatedPolarBear ( n: 0 , before: false , during: false , after: true ) }
525
+ expectEqual ( NSLifetimeTracked . count ( ) , 0 )
526
+ }
527
+
528
+ ThrowingInitTestSuite . test ( " ObjCAnnotatedConvenienceInitSuccess_Root " ) {
529
+ _ = try ! ObjCAnnotatedBear ( before: false )
530
+ _ = try ! ObjCAnnotatedBear ( before2: false )
531
+ _ = try ! ObjCAnnotatedBear ( before: false , before2: false )
532
+ _ = try ! ObjCAnnotatedBear ( during: false )
533
+ _ = try ! ObjCAnnotatedBear ( before: false , during: false )
534
+ _ = try ! ObjCAnnotatedBear ( after: false )
535
+ _ = try ! ObjCAnnotatedBear ( before: false , after: false )
536
+ _ = try ! ObjCAnnotatedBear ( during: false , after: false )
537
+ _ = try ! ObjCAnnotatedBear ( before: false , during: false , after: false )
538
+ _ = try ! ObjCAnnotatedBear ( before: false , before2: false , during: false , after: false )
539
+ expectEqual ( NSLifetimeTracked . count ( ) , 0 )
540
+ }
541
+
542
+ ThrowingInitTestSuite . test ( " ObjCAnnotatedConvenienceInitFailure_Root " ) {
543
+ mustThrow { try ObjCAnnotatedBear ( before: true ) }
544
+ mustThrow { try ObjCAnnotatedBear ( before2: true ) }
545
+ mustThrow { try ObjCAnnotatedBear ( before: true , before2: false ) }
546
+ mustThrow { try ObjCAnnotatedBear ( before: false , before2: true ) }
547
+ mustThrow { try ObjCAnnotatedBear ( during: true ) }
548
+ mustThrow { try ObjCAnnotatedBear ( before: true , during: false ) }
549
+ mustThrow { try ObjCAnnotatedBear ( before: false , during: true ) }
550
+ mustThrow { try ObjCAnnotatedBear ( after: true ) }
551
+ mustThrow { try ObjCAnnotatedBear ( before: true , after: false ) }
552
+ mustThrow { try ObjCAnnotatedBear ( before: false , after: true ) }
553
+ mustThrow { try ObjCAnnotatedBear ( during: true , after: false ) }
554
+ mustThrow { try ObjCAnnotatedBear ( during: false , after: true ) }
555
+ mustThrow { try ObjCAnnotatedBear ( before: true , during: false , after: false ) }
556
+ mustThrow { try ObjCAnnotatedBear ( before: false , during: true , after: false ) }
557
+ mustThrow { try ObjCAnnotatedBear ( before: false , during: false , after: true ) }
558
+ mustThrow { try ObjCAnnotatedBear ( before: true , before2: false , during: false , after: false ) }
559
+ mustThrow { try ObjCAnnotatedBear ( before: false , before2: true , during: false , after: false ) }
560
+ mustThrow { try ObjCAnnotatedBear ( before: false , before2: false , during: true , after: false ) }
561
+ mustThrow { try ObjCAnnotatedBear ( before: false , before2: false , during: false , after: true ) }
562
+ expectEqual ( NSLifetimeTracked . count ( ) , 0 )
563
+ }
564
+
565
+ ThrowingInitTestSuite . test ( " ObjCAnnotatedConvenienceInitSuccess_Derived " ) {
566
+ _ = try ! ObjCAnnotatedPolarBear ( before: false )
567
+ _ = try ! ObjCAnnotatedPolarBear ( before2: false )
568
+ _ = try ! ObjCAnnotatedPolarBear ( before: false , before2: false )
569
+ _ = try ! ObjCAnnotatedPolarBear ( during: false )
570
+ _ = try ! ObjCAnnotatedPolarBear ( before: false , during: false )
571
+ _ = try ! ObjCAnnotatedPolarBear ( after: false )
572
+ _ = try ! ObjCAnnotatedPolarBear ( before: false , after: false )
573
+ _ = try ! ObjCAnnotatedPolarBear ( during: false , after: false )
574
+ _ = try ! ObjCAnnotatedPolarBear ( before: false , during: false , after: false )
575
+ _ = try ! ObjCAnnotatedPolarBear ( before: false , before2: false , during: false , after: false )
576
+ expectEqual ( NSLifetimeTracked . count ( ) , 0 )
577
+ }
578
+
579
+ ThrowingInitTestSuite . test ( " ObjCAnnotatedConvenienceInitFailure_Derived " ) {
580
+ mustThrow { try ObjCAnnotatedPolarBear ( before: true ) }
581
+ mustThrow { try ObjCAnnotatedPolarBear ( before2: true ) }
582
+ mustThrow { try ObjCAnnotatedPolarBear ( before: true , before2: false ) }
583
+ mustThrow { try ObjCAnnotatedPolarBear ( before: false , before2: true ) }
584
+ mustThrow { try ObjCAnnotatedPolarBear ( during: true ) }
585
+ mustThrow { try ObjCAnnotatedPolarBear ( before: true , during: false ) }
586
+ mustThrow { try ObjCAnnotatedPolarBear ( before: false , during: true ) }
587
+ mustThrow { try ObjCAnnotatedPolarBear ( after: true ) }
588
+ mustThrow { try ObjCAnnotatedPolarBear ( before: true , after: false ) }
589
+ mustThrow { try ObjCAnnotatedPolarBear ( before: false , after: true ) }
590
+ mustThrow { try ObjCAnnotatedPolarBear ( during: true , after: false ) }
591
+ mustThrow { try ObjCAnnotatedPolarBear ( during: false , after: true ) }
592
+ mustThrow { try ObjCAnnotatedPolarBear ( before: true , during: false , after: false ) }
593
+ mustThrow { try ObjCAnnotatedPolarBear ( before: false , during: true , after: false ) }
594
+ mustThrow { try ObjCAnnotatedPolarBear ( before: false , during: false , after: true ) }
595
+ mustThrow { try ObjCAnnotatedPolarBear ( before: true , before2: false , during: false , after: false ) }
596
+ mustThrow { try ObjCAnnotatedPolarBear ( before: false , before2: true , during: false , after: false ) }
597
+ mustThrow { try ObjCAnnotatedPolarBear ( before: false , before2: false , during: true , after: false ) }
598
+ mustThrow { try ObjCAnnotatedPolarBear ( before: false , before2: false , during: false , after: true ) }
599
+ expectEqual ( NSLifetimeTracked . count ( ) , 0 )
600
+ }
601
+
327
602
// Specific regression tests:
328
603
329
604
// <rdar://problem/28687665> - "overreleased while already deallocating", for "throws" convenience init in extension
0 commit comments