@@ -1302,8 +1302,13 @@ class ApplyClassifier {
13021302 if (!fnType) return Classification::forInvalidCode ();
13031303
13041304 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+ });
13071312
13081313 // If the function doesn't have any effects or conformances, we're done
13091314 // here.
@@ -1347,21 +1352,21 @@ class ApplyClassifier {
13471352 switch (auto polyKind = fnRef.getPolymorphicEffectKind (kind)) {
13481353 case PolymorphicEffectKind::AsyncSequenceRethrows:
13491354 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 ();
13541358 for (const auto &req : requirements) {
13551359 if (req.getKind () != RequirementKind::Conformance)
13561360 continue ;
13571361
1358- auto conformanceRef = conformances.front ();
1359- conformances = conformances.drop_front ();
1360-
13611362 Type type = req.getFirstType ().subst (substitutions);
1363+
1364+ auto conformanceRef = substitutions.lookupConformance (
1365+ req.getFirstType ()->getCanonicalType (), req.getProtocolDecl ());
1366+ assert (conformanceRef);
1367+
13621368 result.merge (classifyConformance (type, conformanceRef, kind));
13631369 }
1364- assert (conformances.empty ());
13651370
13661371 // 'ByConformance' is a superset of 'ByClosure', so check for
13671372 // closure arguments too.
0 commit comments