Skip to content

Commit 2ad4089

Browse files
committed
Sema: Add TypeResolverContext::ExistentialConstraint
Previously we would resolve the constraint type of an `any` using TypeResolverContext::GenericRequirement, but this does not allow us to distinguish between parametrized protocol types in generic requirements (which are supported) from parametrized protocol types inside an `any`, like `any Sequence<Int>`, which is not supported for now.
1 parent cdcaec2 commit 2ad4089

File tree

2 files changed

+7
-2
lines changed

2 files changed

+7
-2
lines changed

lib/Sema/TypeCheckType.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3666,6 +3666,7 @@ NeverNullType TypeResolver::resolveImplicitlyUnwrappedOptionalType(
36663666
case TypeResolverContext::TypeAliasDecl:
36673667
case TypeResolverContext::GenericTypeAliasDecl:
36683668
case TypeResolverContext::GenericRequirement:
3669+
case TypeResolverContext::ExistentialConstraint:
36693670
case TypeResolverContext::SameTypeRequirement:
36703671
case TypeResolverContext::ProtocolMetatypeBase:
36713672
case TypeResolverContext::MetatypeBase:
@@ -3881,7 +3882,7 @@ NeverNullType
38813882
TypeResolver::resolveExistentialType(ExistentialTypeRepr *repr,
38823883
TypeResolutionOptions options) {
38833884
auto constraintType = resolveType(repr->getConstraint(),
3884-
options.withContext(TypeResolverContext::GenericRequirement));
3885+
options.withContext(TypeResolverContext::ExistentialConstraint));
38853886
if (constraintType->is<ExistentialMetatypeType>())
38863887
return constraintType;
38873888

lib/Sema/TypeCheckType.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,10 @@ enum class TypeResolverContext : uint8_t {
122122
/// Whether we are checking the underlying type of a generic typealias.
123123
GenericTypeAliasDecl,
124124

125-
/// Whether we are in a requirement of a generic declaration
125+
/// Whether we are in the constraint type of an existential type.
126+
ExistentialConstraint,
127+
128+
/// Whether we are in a requirement of a generic declaration.
126129
GenericRequirement,
127130

128131
/// Whether we are in a same-type requirement of a generic
@@ -225,6 +228,7 @@ class TypeResolutionOptions {
225228
case Context::TypeAliasDecl:
226229
case Context::GenericTypeAliasDecl:
227230
case Context::GenericRequirement:
231+
case Context::ExistentialConstraint:
228232
case Context::SameTypeRequirement:
229233
case Context::ProtocolMetatypeBase:
230234
case Context::MetatypeBase:

0 commit comments

Comments
 (0)