Skip to content

Commit 78551fa

Browse files
committed
Sema: Don't call checkConformance() on a type that may contain type variables
1 parent fc9f825 commit 78551fa

File tree

1 file changed

+18
-17
lines changed

1 file changed

+18
-17
lines changed

lib/Sema/CSSolver.cpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2168,17 +2168,24 @@ void DisjunctionChoiceProducer::partitionGenericOperators(
21682168
SmallVector<unsigned, 4> simdOverloads;
21692169
SmallVector<unsigned, 4> otherGenericOverloads;
21702170

2171-
auto refinesOrConformsTo = [&](NominalTypeDecl *nominal, KnownProtocolKind kind) -> bool {
2172-
if (!nominal)
2173-
return false;
2171+
auto &ctx = CS.getASTContext();
2172+
2173+
auto *additiveArithmeticProto = ctx.getProtocol(KnownProtocolKind::AdditiveArithmetic);
2174+
auto *sequenceProto = ctx.getProtocol(KnownProtocolKind::Sequence);
2175+
auto *simdProto = ctx.getProtocol(KnownProtocolKind::SIMD);
21742176

2175-
auto *protocol =
2176-
TypeChecker::getProtocol(CS.getASTContext(), SourceLoc(), kind);
2177+
auto conformsTo = [&](Type type, ProtocolDecl *protocol) -> bool {
2178+
return protocol && bool(CS.lookupConformance(type, protocol));
2179+
};
2180+
2181+
auto refinesOrConformsTo = [&](NominalTypeDecl *nominal, ProtocolDecl *protocol) -> bool {
2182+
if (!nominal || !protocol)
2183+
return false;
21772184

21782185
if (auto *refined = dyn_cast<ProtocolDecl>(nominal))
21792186
return refined->inheritsFrom(protocol);
21802187

2181-
return bool(CS.lookupConformance(nominal->getDeclaredType(), protocol));
2188+
return conformsTo(nominal->getDeclaredInterfaceType(), protocol);
21822189
};
21832190

21842191
// Gather Numeric and Sequence overloads into separate buckets.
@@ -2191,9 +2198,9 @@ void DisjunctionChoiceProducer::partitionGenericOperators(
21912198
simdOverloads.push_back(index);
21922199
} else if (!decl->getInterfaceType()->is<GenericFunctionType>()) {
21932200
concreteOverloads.push_back(index);
2194-
} else if (refinesOrConformsTo(nominal, KnownProtocolKind::AdditiveArithmetic)) {
2201+
} else if (refinesOrConformsTo(nominal, additiveArithmeticProto)) {
21952202
numericOverloads.push_back(index);
2196-
} else if (refinesOrConformsTo(nominal, KnownProtocolKind::Sequence)) {
2203+
} else if (refinesOrConformsTo(nominal, sequenceProto)) {
21972204
sequenceOverloads.push_back(index);
21982205
} else {
21992206
otherGenericOverloads.push_back(index);
@@ -2229,27 +2236,21 @@ void DisjunctionChoiceProducer::partitionGenericOperators(
22292236
if (argType->isTypeVariableOrMember())
22302237
continue;
22312238

2232-
if (TypeChecker::conformsToKnownProtocol(
2233-
argType, KnownProtocolKind::AdditiveArithmetic,
2234-
CS.DC->getParentModule())) {
2239+
if (conformsTo(argType, additiveArithmeticProto)) {
22352240
first =
22362241
std::copy(numericOverloads.begin(), numericOverloads.end(), first);
22372242
numericOverloads.clear();
22382243
break;
22392244
}
22402245

2241-
if (TypeChecker::conformsToKnownProtocol(
2242-
argType, KnownProtocolKind::Sequence,
2243-
CS.DC->getParentModule())) {
2246+
if (conformsTo(argType, sequenceProto)) {
22442247
first =
22452248
std::copy(sequenceOverloads.begin(), sequenceOverloads.end(), first);
22462249
sequenceOverloads.clear();
22472250
break;
22482251
}
22492252

2250-
if (TypeChecker::conformsToKnownProtocol(
2251-
argType, KnownProtocolKind::SIMD,
2252-
CS.DC->getParentModule())) {
2253+
if (conformsTo(argType, simdProto)) {
22532254
first = std::copy(simdOverloads.begin(), simdOverloads.end(), first);
22542255
simdOverloads.clear();
22552256
break;

0 commit comments

Comments
 (0)