Space Engine: uninhabited types map to empty spaces (#17690)
Without this, the compiler ended up complaining about missing cases
that can't actually occur, like `Optional<Never>.some(_)`. This was a
regression from Swift 4.1.
https://bugs.swift.org/browse/SR-8125
(cherry picked from commit e783027061e714ce83523a00e874bd30b34c1eb0)
diff --git a/lib/Sema/TypeCheckSwitchStmt.cpp b/lib/Sema/TypeCheckSwitchStmt.cpp
index 20fa075..2cd9203 100644
--- a/lib/Sema/TypeCheckSwitchStmt.cpp
+++ b/lib/Sema/TypeCheckSwitchStmt.cpp
@@ -214,6 +214,8 @@
Spaces({}) {}
static Space forType(Type T, Identifier NameForPrinting) {
+ if (T->isStructurallyUninhabited())
+ return Space();
return Space(T, NameForPrinting);
}
static Space forUnknown(bool allowedButNotRequired) {
diff --git a/test/Compatibility/exhaustive_switch.swift b/test/Compatibility/exhaustive_switch.swift
index b315f0e..5ceee65 100644
--- a/test/Compatibility/exhaustive_switch.swift
+++ b/test/Compatibility/exhaustive_switch.swift
@@ -1184,3 +1184,23 @@
case .notYetIntroduced: break
} // no-error
}
+
+// The following test used to behave differently when the uninhabited enum was
+// defined in the same module as the function (as opposed to using Swift.Never).
+enum NoError {}
+extension Result where T == NoError {
+ func testUninhabited() {
+ switch self {
+ case .Error(_):
+ break
+ // No .Ok case possible because of the 'NoError'.
+ }
+
+ switch self {
+ case .Error(_):
+ break
+ case .Ok(_):
+ break // But it's okay to write one.
+ }
+ }
+}
diff --git a/test/Sema/exhaustive_switch.swift b/test/Sema/exhaustive_switch.swift
index 884dc69..a230307 100644
--- a/test/Sema/exhaustive_switch.swift
+++ b/test/Sema/exhaustive_switch.swift
@@ -1223,3 +1223,23 @@
case .notYetIntroduced: break
} // no-error
}
+
+// The following test used to behave differently when the uninhabited enum was
+// defined in the same module as the function (as opposed to using Swift.Never).
+enum NoError {}
+extension Result where T == NoError {
+ func testUninhabited() {
+ switch self {
+ case .Error(_):
+ break
+ // No .Ok case possible because of the 'NoError'.
+ }
+
+ switch self {
+ case .Error(_):
+ break
+ case .Ok(_):
+ break // But it's okay to write one.
+ }
+ }
+}