| // RUN: not %target-swift-frontend -emit-sil %s -emit-fixits-path %t.remap -enable-resilience -enable-nonfrozen-enum-exhaustivity-diagnostics -diagnostics-editor-mode |
| // RUN: c-arcmt-test %t.remap | arcmt-test -verify-transformed-files %s.result |
| |
| enum Runcible { |
| case spoon |
| case hat |
| case fork |
| } |
| |
| func checkDiagnosticMinimality(x: Runcible?) { |
| switch (x!, x!) { |
| case (.spoon, .spoon): |
| break |
| case (.spoon, .hat): |
| break |
| case (.hat, .spoon): |
| break |
| case (.fork, _): |
| <#code#> |
| case (.hat, .hat): |
| <#code#> |
| case (_, .fork): |
| <#code#> |
| } |
| |
| switch (x!, x!) { |
| case (.spoon, .spoon): |
| break |
| case (.hat, .hat): |
| break |
| case (.fork, _): |
| <#code#> |
| case (.hat, .spoon): |
| <#code#> |
| case (.spoon, .hat): |
| <#code#> |
| case (_, .fork): |
| <#code#> |
| } |
| } |
| |
| enum LargeSpaceEnum { |
| case case0 |
| case case1 |
| case case2 |
| case case3 |
| case case4 |
| case case5 |
| case case6 |
| case case7 |
| case case8 |
| case case9 |
| case case10 |
| } |
| |
| func notQuiteBigEnough() -> Bool { |
| switch (LargeSpaceEnum.case1, LargeSpaceEnum.case2) { |
| case (.case0, .case0): return true |
| case (.case1, .case1): return true |
| case (.case2, .case2): return true |
| case (.case3, .case3): return true |
| case (.case4, .case4): return true |
| case (.case5, .case5): return true |
| case (.case6, .case6): return true |
| case (.case7, .case7): return true |
| case (.case8, .case8): return true |
| case (.case9, .case9): return true |
| case (.case10, .case10): return true |
| case (.case10, .case0): |
| <#code#> |
| case (.case10, .case1): |
| <#code#> |
| case (.case10, .case2): |
| <#code#> |
| case (.case10, .case3): |
| <#code#> |
| case (.case10, .case4): |
| <#code#> |
| case (.case10, .case5): |
| <#code#> |
| case (.case10, .case6): |
| <#code#> |
| case (.case10, .case7): |
| <#code#> |
| case (.case10, .case8): |
| <#code#> |
| case (.case10, .case9): |
| <#code#> |
| case (.case9, .case0): |
| <#code#> |
| case (.case9, .case1): |
| <#code#> |
| case (.case9, .case2): |
| <#code#> |
| case (.case9, .case3): |
| <#code#> |
| case (.case9, .case4): |
| <#code#> |
| case (.case9, .case5): |
| <#code#> |
| case (.case9, .case6): |
| <#code#> |
| case (.case9, .case7): |
| <#code#> |
| case (.case9, .case8): |
| <#code#> |
| case (.case9, .case10): |
| <#code#> |
| case (.case8, .case0): |
| <#code#> |
| case (.case8, .case1): |
| <#code#> |
| case (.case8, .case2): |
| <#code#> |
| case (.case8, .case3): |
| <#code#> |
| case (.case8, .case4): |
| <#code#> |
| case (.case8, .case5): |
| <#code#> |
| case (.case8, .case6): |
| <#code#> |
| case (.case8, .case7): |
| <#code#> |
| case (.case8, .case9): |
| <#code#> |
| case (.case8, .case10): |
| <#code#> |
| case (.case7, .case0): |
| <#code#> |
| case (.case7, .case1): |
| <#code#> |
| case (.case7, .case2): |
| <#code#> |
| case (.case7, .case3): |
| <#code#> |
| case (.case7, .case4): |
| <#code#> |
| case (.case7, .case5): |
| <#code#> |
| case (.case7, .case6): |
| <#code#> |
| case (.case7, .case8): |
| <#code#> |
| case (.case7, .case9): |
| <#code#> |
| case (.case7, .case10): |
| <#code#> |
| case (.case6, .case0): |
| <#code#> |
| case (.case6, .case1): |
| <#code#> |
| case (.case6, .case2): |
| <#code#> |
| case (.case6, .case3): |
| <#code#> |
| case (.case6, .case4): |
| <#code#> |
| case (.case6, .case5): |
| <#code#> |
| case (.case6, .case7): |
| <#code#> |
| case (.case6, .case8): |
| <#code#> |
| case (.case6, .case9): |
| <#code#> |
| case (.case6, .case10): |
| <#code#> |
| case (.case5, .case0): |
| <#code#> |
| case (.case5, .case1): |
| <#code#> |
| case (.case5, .case2): |
| <#code#> |
| case (.case5, .case3): |
| <#code#> |
| case (.case5, .case4): |
| <#code#> |
| case (.case5, .case6): |
| <#code#> |
| case (.case5, .case7): |
| <#code#> |
| case (.case5, .case8): |
| <#code#> |
| case (.case5, .case9): |
| <#code#> |
| case (.case5, .case10): |
| <#code#> |
| case (.case4, .case0): |
| <#code#> |
| case (.case4, .case1): |
| <#code#> |
| case (.case4, .case2): |
| <#code#> |
| case (.case4, .case3): |
| <#code#> |
| case (.case4, .case5): |
| <#code#> |
| case (.case4, .case6): |
| <#code#> |
| case (.case4, .case7): |
| <#code#> |
| case (.case4, .case8): |
| <#code#> |
| case (.case4, .case9): |
| <#code#> |
| case (.case4, .case10): |
| <#code#> |
| case (.case3, .case0): |
| <#code#> |
| case (.case3, .case1): |
| <#code#> |
| case (.case3, .case2): |
| <#code#> |
| case (.case3, .case4): |
| <#code#> |
| case (.case3, .case5): |
| <#code#> |
| case (.case3, .case6): |
| <#code#> |
| case (.case3, .case7): |
| <#code#> |
| case (.case3, .case8): |
| <#code#> |
| case (.case3, .case9): |
| <#code#> |
| case (.case3, .case10): |
| <#code#> |
| case (.case2, .case0): |
| <#code#> |
| case (.case2, .case1): |
| <#code#> |
| case (.case2, .case3): |
| <#code#> |
| case (.case2, .case4): |
| <#code#> |
| case (.case2, .case5): |
| <#code#> |
| case (.case2, .case6): |
| <#code#> |
| case (.case2, .case7): |
| <#code#> |
| case (.case2, .case8): |
| <#code#> |
| case (.case2, .case9): |
| <#code#> |
| case (.case2, .case10): |
| <#code#> |
| case (.case1, .case0): |
| <#code#> |
| case (.case1, .case2): |
| <#code#> |
| case (.case1, .case3): |
| <#code#> |
| case (.case1, .case4): |
| <#code#> |
| case (.case1, .case5): |
| <#code#> |
| case (.case1, .case6): |
| <#code#> |
| case (.case1, .case7): |
| <#code#> |
| case (.case1, .case8): |
| <#code#> |
| case (.case1, .case9): |
| <#code#> |
| case (.case1, .case10): |
| <#code#> |
| case (.case0, .case1): |
| <#code#> |
| case (.case0, .case2): |
| <#code#> |
| case (.case0, .case3): |
| <#code#> |
| case (.case0, .case4): |
| <#code#> |
| case (.case0, .case5): |
| <#code#> |
| case (.case0, .case6): |
| <#code#> |
| case (.case0, .case7): |
| <#code#> |
| case (.case0, .case8): |
| <#code#> |
| case (.case0, .case9): |
| <#code#> |
| case (.case0, .case10): |
| <#code#> |
| } |
| } |
| |
| enum OverlyLargeSpaceEnum { |
| case case0 |
| case case1 |
| case case2 |
| case case3 |
| case case4 |
| case case5 |
| case case6 |
| case case7 |
| case case8 |
| case case9 |
| case case10 |
| case case11 |
| } |
| |
| enum ContainsOverlyLargeEnum { |
| case one(OverlyLargeSpaceEnum) |
| case two(OverlyLargeSpaceEnum) |
| case three(OverlyLargeSpaceEnum, OverlyLargeSpaceEnum) |
| } |
| |
| func quiteBigEnough() -> Bool { |
| switch (OverlyLargeSpaceEnum.case1, OverlyLargeSpaceEnum.case2) { |
| case (.case0, .case0): return true |
| case (.case1, .case1): return true |
| case (.case2, .case2): return true |
| case (.case3, .case3): return true |
| case (.case4, .case4): return true |
| case (.case5, .case5): return true |
| case (.case6, .case6): return true |
| case (.case7, .case7): return true |
| case (.case8, .case8): return true |
| case (.case9, .case9): return true |
| case (.case10, .case10): return true |
| case (.case11, .case11): return true |
| default: |
| <#fatalError()#> |
| } |
| |
| switch (OverlyLargeSpaceEnum.case1, OverlyLargeSpaceEnum.case2) { |
| case (.case0, _): return true |
| case (.case1, _): return true |
| case (.case2, _): return true |
| case (.case3, _): return true |
| case (.case4, _): return true |
| case (.case5, _): return true |
| case (.case6, _): return true |
| case (.case7, _): return true |
| case (.case8, _): return true |
| case (.case9, _): return true |
| case (.case10, _): return true |
| default: |
| <#fatalError()#> |
| } |
| } |
| |
| indirect enum InfinitelySized { |
| case one |
| case two |
| case recur(InfinitelySized) |
| case mutualRecur(MutuallyRecursive, InfinitelySized) |
| } |
| |
| indirect enum MutuallyRecursive { |
| case one |
| case two |
| case recur(MutuallyRecursive) |
| case mutualRecur(InfinitelySized, MutuallyRecursive) |
| } |
| |
| func infinitelySized() -> Bool { |
| switch (InfinitelySized.one, InfinitelySized.one) { |
| case (.one, .one): return true |
| case (.two, .two): return true |
| case (.recur(_), _): |
| <#code#> |
| case (.mutualRecur(_, _), _): |
| <#code#> |
| case (.two, .one): |
| <#code#> |
| case (.recur(_), .mutualRecur(_, _)): |
| <#code#> |
| case (.mutualRecur(_, _), .mutualRecur(_, _)): |
| <#code#> |
| case (.one, .two): |
| <#code#> |
| case (_, .recur(_)): |
| <#code#> |
| case (_, .mutualRecur(_, _)): |
| <#code#> |
| } |
| |
| switch (MutuallyRecursive.one, MutuallyRecursive.one) { |
| case (.one, .one): return true |
| case (.two, .two): return true |
| case (.recur(_), _): |
| <#code#> |
| case (.mutualRecur(_, _), _): |
| <#code#> |
| case (.two, .one): |
| <#code#> |
| case (.recur(_), .mutualRecur(_, _)): |
| <#code#> |
| case (.mutualRecur(_, _), .mutualRecur(_, _)): |
| <#code#> |
| case (.one, .two): |
| <#code#> |
| case (_, .recur(_)): |
| <#code#> |
| case (_, .mutualRecur(_, _)): |
| <#code#> |
| } |
| } |
| |
| public enum NonExhaustive { |
| case a, b |
| } |
| |
| public enum NonExhaustivePayload { |
| case a(Int), b(Bool) |
| } |
| |
| @_frozen public enum TemporalProxy { |
| case seconds(Int) |
| case milliseconds(Int) |
| case microseconds(Int) |
| case nanoseconds(Int) |
| @_downgrade_exhaustivity_check |
| case never |
| } |
| |
| // Inlineable code is considered "outside" the module and must include a default |
| // case. |
| @inlinable |
| public func testNonExhaustive(_ value: NonExhaustive, _ payload: NonExhaustivePayload, for interval: TemporalProxy, flag: Bool) { |
| switch value { |
| case .a: break |
| case .b: |
| <#code#> |
| @unknown default: |
| <#code#> |
| } |
| |
| switch value { |
| case .a: break |
| case .b: break |
| @unknown default: |
| <#fatalError()#> |
| } |
| |
| switch value { |
| case .a: break |
| case .b: break |
| default: break // no-warning |
| } |
| |
| switch value { |
| case .a: break |
| case .b: break |
| @unknown case _: break // no-warning |
| } |
| |
| switch value { |
| case .a: break |
| case .b: |
| <#code#> |
| @unknown case _: break |
| } |
| |
| switch value { |
| case .a: |
| <#code#> |
| case .b: |
| <#code#> |
| @unknown case _: break |
| } |
| |
| // Test being part of other spaces. |
| switch value as Optional { |
| case .a?: break |
| case .b?: break |
| case nil: break |
| case .some(_): |
| <#code#> |
| } |
| |
| switch value as Optional { |
| case .a?: break |
| case .b?: break |
| case nil: break |
| @unknown case _: break |
| } // no-warning |
| |
| switch value as Optional { |
| case _?: break |
| case nil: break |
| } // no-warning |
| |
| switch (value, flag) { |
| case (.a, _): break |
| case (.b, false): break |
| case (_, true): break |
| case (_, false): |
| <#code#> |
| } |
| |
| switch (value, flag) { |
| case (.a, _): break |
| case (.b, false): break |
| case (_, true): break |
| @unknown case _: break |
| } // no-warning |
| |
| switch (flag, value) { |
| case (_, .a): break |
| case (false, .b): break |
| case (true, _): break |
| case (false, _): |
| <#code#> |
| } |
| |
| switch (flag, value) { |
| case (_, .a): break |
| case (false, .b): break |
| case (true, _): break |
| @unknown case _: break |
| } // no-warning |
| |
| switch (value, value) { |
| case (.a, _), (_, .a): break |
| case (.b, _), (_, .b): break |
| case (_, _): |
| <#code#> |
| } |
| |
| switch (value, value) { |
| case (.a, _), (_, .a): break |
| case (.b, _), (_, .b): break |
| @unknown case _: break |
| } // no-warning |
| |
| // Test interaction with @_downgrade_exhaustivity_check. |
| switch (value, interval) { |
| case (_, .seconds): break |
| case (.a, _): break |
| case (.b, _): break |
| case (_, .milliseconds(_)): |
| <#code#> |
| case (_, .microseconds(_)): |
| <#code#> |
| case (_, .nanoseconds(_)): |
| <#code#> |
| case (_, .never): |
| <#code#> |
| } |
| |
| switch (value, interval) { |
| case (_, .never): break |
| case (.a, _): break |
| case (.b, _): break |
| case (_, .seconds(_)): |
| <#code#> |
| case (_, .milliseconds(_)): |
| <#code#> |
| case (_, .microseconds(_)): |
| <#code#> |
| case (_, .nanoseconds(_)): |
| <#code#> |
| } |
| |
| // Test payloaded enums. |
| switch payload { |
| case .a: break |
| case .b(_): |
| <#code#> |
| @unknown default: |
| <#code#> |
| } |
| |
| switch payload { |
| case .a: break |
| case .b: break |
| @unknown default: |
| <#fatalError()#> |
| } |
| |
| switch payload { |
| case .a: break |
| case .b: break |
| default: break // no-warning |
| } |
| |
| switch payload { |
| case .a: break |
| case .b: break |
| @unknown case _: break // no-warning |
| } |
| |
| switch payload { |
| case .a: break |
| case .b(_): |
| <#code#> |
| @unknown case _: break |
| } |
| |
| switch payload { |
| case .a: break |
| case .b(false): break |
| case .b(true): |
| <#code#> |
| @unknown default: |
| <#code#> |
| } |
| |
| switch payload { |
| case .a: break |
| case .b(false): break |
| case .b(true): |
| <#code#> |
| @unknown case _: break |
| } |
| } |