| // RUN: %target-run-simple-swift |
| |
| // REQUIRES: executable_test |
| |
| import StdlibUnittest |
| |
| // Make sure that in the following code we do not leak the case of the enum. |
| |
| protocol MyProtocol {} |
| |
| // An enum that wraps LeakingClass |
| enum LeakingEnum1: MyProtocol { |
| case eNone1 |
| case eLeakingClass1(LifetimeTracked) |
| } |
| |
| // An enum that wraps LeakingClass |
| enum LeakingEnum2 : MyProtocol { |
| case eNone2 |
| case eLeakingClass2(LifetimeTracked) |
| } |
| |
| var Tests = TestSuite("patternmatch_on_enum_protocol_leak") |
| |
| Tests.test("dontLeak") { |
| do { |
| let leakingClass = LifetimeTracked(0) |
| let leakEnum = LeakingEnum1.eLeakingClass1(leakingClass) |
| let control: MyProtocol = leakEnum |
| |
| // This switch case order, interleaving LeakingEnum1 and LeakingEnum2 cases triggers the leak. |
| switch control |
| { |
| case LeakingEnum1.eNone1: break |
| case LeakingEnum2.eNone2: break |
| |
| case LeakingEnum1.eLeakingClass1: break |
| case LeakingEnum2.eLeakingClass2: break |
| |
| default: break |
| } |
| } |
| expectEqual(0, LifetimeTracked.instances) |
| } |
| |
| runAllTests() |