Skip to content

Commit 0177f75

Browse files
committed
AST: TypeBase::isConstraintType() answers true for ParameterizedProtocolType also
1 parent aa67c8b commit 0177f75

File tree

5 files changed

+10
-12
lines changed

5 files changed

+10
-12
lines changed

include/swift/AST/Types.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6365,7 +6365,8 @@ inline bool TypeBase::isConstraintType() const {
63656365

63666366
inline bool CanType::isConstraintTypeImpl(CanType type) {
63676367
return (isa<ProtocolType>(type) ||
6368-
isa<ProtocolCompositionType>(type));
6368+
isa<ProtocolCompositionType>(type) ||
6369+
isa<ParameterizedProtocolType>(type));
63696370
}
63706371

63716372
inline bool TypeBase::isExistentialType() {

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4500,9 +4500,7 @@ ConstraintResult GenericSignatureBuilder::addTypeRequirement(
45004500
}
45014501

45024502
// Check whether we have a reasonable constraint type at all.
4503-
if (!constraintType->is<ProtocolType>() &&
4504-
!constraintType->is<ProtocolCompositionType>() &&
4505-
!constraintType->is<ParameterizedProtocolType>() &&
4503+
if (!constraintType->isConstraintType() &&
45064504
!constraintType->getClassOrBoundGenericClass()) {
45074505
if (source.getLoc().isValid() && !constraintType->hasError()) {
45084506
Impl->HadAnyError = true;

lib/AST/RequirementMachine/RequirementLowering.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,7 @@ static void realizeTypeRequirement(Type subjectType, Type constraintType,
212212
SmallVectorImpl<StructuralRequirement> &result) {
213213
SmallVector<Requirement, 2> reqs;
214214

215-
if (constraintType->is<ProtocolType>() ||
216-
constraintType->is<ProtocolCompositionType>() ||
217-
constraintType->is<ParameterizedProtocolType>()) {
215+
if (constraintType->isConstraintType()) {
218216
// Handle conformance requirements.
219217
desugarConformanceRequirement(subjectType, constraintType, reqs);
220218
} else if (constraintType->getClassOrBoundGenericClass()) {

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,8 @@ OpaqueResultTypeRequest::evaluate(Evaluator &evaluator,
227227
return nullptr;
228228

229229
// Error out if the constraint type isn't a class or existential type.
230-
if (!constraintType->getClassOrBoundGenericClass() &&
231-
!constraintType->is<ProtocolType>() &&
232-
!constraintType->is<ProtocolCompositionType>() &&
233-
!constraintType->is<ParameterizedProtocolType>()) {
230+
if (!constraintType->isConstraintType() &&
231+
!constraintType->getClassOrBoundGenericClass()) {
234232
ctx.Diags.diagnose(currentRepr->getLoc(),
235233
diag::opaque_type_invalid_constraint);
236234
return nullptr;

lib/Sema/TypeCheckType.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3856,7 +3856,10 @@ TypeResolver::resolveCompositionType(CompositionTypeRepr *repr,
38563856
continue;
38573857
}
38583858

3859-
if (ty->isConstraintType()) {
3859+
// FIXME: Support compositions involving parameterized protocol types,
3860+
// like Collection<String> & Sendable, etc.
3861+
if (ty->isConstraintType() &&
3862+
!ty->is<ParameterizedProtocolType>()) {
38603863
auto layout = ty->getExistentialLayout();
38613864
if (auto superclass = layout.explicitSuperclass)
38623865
if (checkSuperclass(tyR->getStartLoc(), superclass))

0 commit comments

Comments
 (0)