Merge pull request #15265 from slavapestov/decl-name-cleanups
DeclName-related cleanups
diff --git a/lib/Sema/TypeCheckSwitchStmt.cpp b/lib/Sema/TypeCheckSwitchStmt.cpp
index 215a8f2..015d456 100644
--- a/lib/Sema/TypeCheckSwitchStmt.cpp
+++ b/lib/Sema/TypeCheckSwitchStmt.cpp
@@ -1347,15 +1347,12 @@
switch (IP->getCastKind()) {
case CheckedCastKind::Coercion:
case CheckedCastKind::BridgingCoercion: {
- // If the pattern and subpattern types are identical than this is a
- // non-useful cast that we've already warned about, but it also means
- // this pattern itself is a no-op and we should examine the subpattern.
auto *subPattern = IP->getSubPattern();
- if (subPattern && IP->getType()->isEqual(subPattern->getType()))
+ if (subPattern)
return projectPattern(TC, subPattern, sawDowngradablePattern);
- // These coercions are irrefutable. Project with the original type
- // instead of the cast's target type to maintain consistency with the
+ // With no subpattern coercions are irrefutable. Project with the original
+ // type instead of the cast's target type to maintain consistency with the
// scrutinee's type.
return Space(IP->getType(), Identifier());
}
diff --git a/test/Sema/exhaustive_switch.swift b/test/Sema/exhaustive_switch.swift
index caa6469..660aff4 100644
--- a/test/Sema/exhaustive_switch.swift
+++ b/test/Sema/exhaustive_switch.swift
@@ -801,4 +801,13 @@
case .a: // expected-warning {{case is already handled by previous patterns; consider removing it}}
print("second a")
}
+
+ func foo(_ str: String) -> Int {
+ switch str { // expected-error {{switch must be exhaustive}}
+ // expected-note@-1 {{do you want to add a default clause?}}
+ case let (x as Int) as Any:
+ return x
+ }
+ }
+ _ = foo("wtf")
}