@@ -2387,48 +2387,28 @@ ASTContext::getBuiltinConformance(
23872387 return entry;
23882388}
23892389
2390- // / If one of the ancestor conformances already has a matching type, use
2391- // / that instead.
2392- static ProtocolConformance *collapseSpecializedConformance (
2393- Type type,
2394- ProtocolConformance *conformance,
2395- SubstitutionMap substitutions) {
2396- while (true ) {
2397- switch (conformance->getKind ()) {
2398- case ProtocolConformanceKind::Specialized:
2399- conformance = cast<SpecializedProtocolConformance>(conformance)
2400- ->getGenericConformance ();
2401- break ;
2402-
2403- case ProtocolConformanceKind::Normal:
2404- case ProtocolConformanceKind::Inherited:
2405- case ProtocolConformanceKind::Self:
2406- case ProtocolConformanceKind::Builtin:
2407- // If the conformance matches, return it.
2408- if (conformance->getType ()->isEqual (type)) {
2409- for (auto subConformance : substitutions.getConformances ())
2410- if (!subConformance.isAbstract ())
2411- return nullptr ;
2412-
2413- return conformance;
2414- }
2390+ static bool collapseSpecializedConformance (Type type,
2391+ RootProtocolConformance *conformance,
2392+ SubstitutionMap substitutions) {
2393+ if (!conformance->getType ()->isEqual (type))
2394+ return false ;
24152395
2416- return nullptr ;
2417- }
2396+ for (auto subConformance : substitutions.getConformances ()) {
2397+ if (!subConformance.isAbstract ())
2398+ return false ;
24182399 }
2400+
2401+ return true ;
24192402}
24202403
24212404ProtocolConformance *
24222405ASTContext::getSpecializedConformance (Type type,
2423- ProtocolConformance *generic,
2406+ RootProtocolConformance *generic,
24242407 SubstitutionMap substitutions) {
2425- // If we are performing a substitution that would get us back to the
2426- // a prior conformance (e.g., mapping into and then out of a conformance),
2427- // return the existing conformance.
2428- if (auto existing = collapseSpecializedConformance (type, generic,
2429- substitutions)) {
2408+ // If the specialization is a no-op, use the root conformance instead.
2409+ if (collapseSpecializedConformance (type, generic, substitutions)) {
24302410 ++NumCollapsedSpecializedProtocolConformances;
2431- return existing ;
2411+ return generic ;
24322412 }
24332413
24342414 llvm::FoldingSetNodeID id;
0 commit comments