@@ -2168,17 +2168,24 @@ void DisjunctionChoiceProducer::partitionGenericOperators(
2168
2168
SmallVector<unsigned , 4 > simdOverloads;
2169
2169
SmallVector<unsigned , 4 > otherGenericOverloads;
2170
2170
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);
2174
2176
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 ;
2177
2184
2178
2185
if (auto *refined = dyn_cast<ProtocolDecl>(nominal))
2179
2186
return refined->inheritsFrom (protocol);
2180
2187
2181
- return bool (CS. lookupConformance ( nominal->getDeclaredType (), protocol) );
2188
+ return conformsTo ( nominal->getDeclaredInterfaceType (), protocol);
2182
2189
};
2183
2190
2184
2191
// Gather Numeric and Sequence overloads into separate buckets.
@@ -2191,9 +2198,9 @@ void DisjunctionChoiceProducer::partitionGenericOperators(
2191
2198
simdOverloads.push_back (index);
2192
2199
} else if (!decl->getInterfaceType ()->is <GenericFunctionType>()) {
2193
2200
concreteOverloads.push_back (index);
2194
- } else if (refinesOrConformsTo (nominal, KnownProtocolKind::AdditiveArithmetic )) {
2201
+ } else if (refinesOrConformsTo (nominal, additiveArithmeticProto )) {
2195
2202
numericOverloads.push_back (index);
2196
- } else if (refinesOrConformsTo (nominal, KnownProtocolKind::Sequence )) {
2203
+ } else if (refinesOrConformsTo (nominal, sequenceProto )) {
2197
2204
sequenceOverloads.push_back (index);
2198
2205
} else {
2199
2206
otherGenericOverloads.push_back (index);
@@ -2229,27 +2236,21 @@ void DisjunctionChoiceProducer::partitionGenericOperators(
2229
2236
if (argType->isTypeVariableOrMember ())
2230
2237
continue ;
2231
2238
2232
- if (TypeChecker::conformsToKnownProtocol (
2233
- argType, KnownProtocolKind::AdditiveArithmetic,
2234
- CS.DC ->getParentModule ())) {
2239
+ if (conformsTo (argType, additiveArithmeticProto)) {
2235
2240
first =
2236
2241
std::copy (numericOverloads.begin (), numericOverloads.end (), first);
2237
2242
numericOverloads.clear ();
2238
2243
break ;
2239
2244
}
2240
2245
2241
- if (TypeChecker::conformsToKnownProtocol (
2242
- argType, KnownProtocolKind::Sequence,
2243
- CS.DC ->getParentModule ())) {
2246
+ if (conformsTo (argType, sequenceProto)) {
2244
2247
first =
2245
2248
std::copy (sequenceOverloads.begin (), sequenceOverloads.end (), first);
2246
2249
sequenceOverloads.clear ();
2247
2250
break ;
2248
2251
}
2249
2252
2250
- if (TypeChecker::conformsToKnownProtocol (
2251
- argType, KnownProtocolKind::SIMD,
2252
- CS.DC ->getParentModule ())) {
2253
+ if (conformsTo (argType, simdProto)) {
2253
2254
first = std::copy (simdOverloads.begin (), simdOverloads.end (), first);
2254
2255
simdOverloads.clear ();
2255
2256
break ;
0 commit comments