// RUN: not %target-swift-frontend -emit-sil %s -emit-fixits-path %t.remap -enable-library-evolution -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 case (.case11, .case0): <#code#> case (.case11, .case1): <#code#> case (.case11, .case2): <#code#> case (.case11, .case3): <#code#> case (.case11, .case4): <#code#> case (.case11, .case5): <#code#> case (.case11, .case6): <#code#> case (.case11, .case7): <#code#> case (.case11, .case8): <#code#> case (.case11, .case9): <#code#> case (.case11, .case10): <#code#> 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 (.case10, .case11): <#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 (.case9, .case11): <#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 (.case8, .case11): <#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 (.case7, .case11): <#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 (.case6, .case11): <#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 (.case5, .case11): <#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 (.case4, .case11): <#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 (.case3, .case11): <#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 (.case2, .case11): <#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 (.case1, .case11): <#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#> case (.case0, .case11): <#code#> } 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 case (.case11, _): <#code#> } } 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) 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 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 } }