@@ -1302,8 +1302,13 @@ class ApplyClassifier {
1302
1302
if (!fnType) return Classification::forInvalidCode ();
1303
1303
1304
1304
auto fnRef = AbstractFunction::getAppliedFn (E);
1305
- auto conformances = fnRef.getSubstitutions ().getConformances ();
1306
- const auto hasAnyConformances = !conformances.empty ();
1305
+ auto substitutions = fnRef.getSubstitutions ();
1306
+ const bool hasAnyConformances =
1307
+ llvm::any_of (substitutions.getConformances (),
1308
+ [](const ProtocolConformanceRef conformance) {
1309
+ auto *requirement = conformance.getRequirement ();
1310
+ return !requirement->getInvertibleProtocolKind ();
1311
+ });
1307
1312
1308
1313
// If the function doesn't have any effects or conformances, we're done
1309
1314
// here.
@@ -1347,21 +1352,21 @@ class ApplyClassifier {
1347
1352
switch (auto polyKind = fnRef.getPolymorphicEffectKind (kind)) {
1348
1353
case PolymorphicEffectKind::AsyncSequenceRethrows:
1349
1354
case PolymorphicEffectKind::ByConformance: {
1350
- auto substitutions = fnRef.getSubstitutions ();
1351
- auto requirements =
1352
- substitutions.getGenericSignature ().getRequirements ();
1353
- auto conformances = substitutions.getConformances ();
1355
+ auto requirements = substitutions.getGenericSignature ()
1356
+ .withoutMarkerProtocols ()
1357
+ .getRequirements ();
1354
1358
for (const auto &req : requirements) {
1355
1359
if (req.getKind () != RequirementKind::Conformance)
1356
1360
continue ;
1357
1361
1358
- auto conformanceRef = conformances.front ();
1359
- conformances = conformances.drop_front ();
1360
-
1361
1362
Type type = req.getFirstType ().subst (substitutions);
1363
+
1364
+ auto conformanceRef = substitutions.lookupConformance (
1365
+ req.getFirstType ()->getCanonicalType (), req.getProtocolDecl ());
1366
+ assert (conformanceRef);
1367
+
1362
1368
result.merge (classifyConformance (type, conformanceRef, kind));
1363
1369
}
1364
- assert (conformances.empty ());
1365
1370
1366
1371
// 'ByConformance' is a superset of 'ByClosure', so check for
1367
1372
// closure arguments too.
0 commit comments