Skip to content

Commit a8c47de

Browse files
authored
Merge pull request swiftlang#31831 from gottesmm/pr-91bb523a50019c1625bffb3b1f8b6109efc91acd
2 parents 4d000f0 + a99a93d commit a8c47de

File tree

1 file changed

+282
-7
lines changed

1 file changed

+282
-7
lines changed

test/Interpreter/objc_throwing_initializers.swift

Lines changed: 282 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ enum E : Error {
1818
case X
1919
}
2020

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+
2130
func unwrap(_ b: Bool) throws -> Int {
2231
if b {
2332
throw E.X
@@ -190,13 +199,6 @@ class GuineaPig<T> : Bear {
190199
}
191200
}
192201

193-
func mustThrow<T>(_ f: () throws -> T) {
194-
do {
195-
try f()
196-
preconditionFailure("Didn't throw")
197-
} catch {}
198-
}
199-
200202
ThrowingInitTestSuite.test("DesignatedInitSuccess_Root") {
201203
_ = try! Bear(n: 0, before: false)
202204
_ = try! Bear(n: 0, after: false)
@@ -324,6 +326,279 @@ ThrowingInitTestSuite.test("ConvenienceInitFailure_Derived") {
324326
expectEqual(NSLifetimeTracked.count(), 0)
325327
}
326328

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+
327602
// Specific regression tests:
328603

329604
// <rdar://problem/28687665> - "overreleased while already deallocating", for "throws" convenience init in extension

0 commit comments

Comments
 (0)