Merge pull request #12633 from DougGregor/sr-6100
diff --git a/lib/Sema/TypeCheckPattern.cpp b/lib/Sema/TypeCheckPattern.cpp
index debb18a..3a93cad 100644
--- a/lib/Sema/TypeCheckPattern.cpp
+++ b/lib/Sema/TypeCheckPattern.cpp
@@ -1321,8 +1321,9 @@
}
// Otherwise, if the type is an unbound generic of the context type, use
// the context type to resolve the parameters.
- else if (parentTy->is<UnboundGenericType>()) {
- if (parentTy->getAnyNominal() == type->getAnyNominal()) {
+ else if (parentTy->hasUnboundGenericType()) {
+ if (parentTy->is<UnboundGenericType>() &&
+ parentTy->getAnyNominal() == type->getAnyNominal()) {
enumTy = type;
} else {
diagnose(EEP->getLoc(), diag::ambiguous_enum_pattern_type,
diff --git a/test/Constraints/patterns.swift b/test/Constraints/patterns.swift
index f024d23..b56e228 100644
--- a/test/Constraints/patterns.swift
+++ b/test/Constraints/patterns.swift
@@ -336,3 +336,19 @@
break;
}
}
+
+
+// SR-6100
+struct One<Two> {
+ public enum E: Error {
+ // if you remove associated value, everything works
+ case SomeError(String)
+ }
+}
+
+func testOne() {
+ do {
+ } catch let error { // expected-warning{{'catch' block is unreachable because no errors are thrown in 'do' block}}
+ if case One.E.SomeError = error {} // expected-error{{generic enum type 'One.E' is ambiguous without explicit generic parameters when matching value of type 'Error'}}
+ }
+}