From 1df19823c4d21d96f0c07ab4b3925a019eeb47e5 Mon Sep 17 00:00:00 2001 From: Kavon Farvardin Date: Thu, 28 Mar 2024 11:19:29 -0700 Subject: [PATCH 1/2] NCGenerics: update `MakeAbstractConformanceForGenericType` We should just return the builtin conformances for Copyable/Escapable, since those are the only kinds of unconditional conformances for these marker protocols. resolves rdar://125460667 --- lib/AST/TypeSubstitution.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/AST/TypeSubstitution.cpp b/lib/AST/TypeSubstitution.cpp index 9f1f2d4a9b5ad..03e7fb3ec8cc9 100644 --- a/lib/AST/TypeSubstitution.cpp +++ b/lib/AST/TypeSubstitution.cpp @@ -251,6 +251,15 @@ operator()(CanType dependentType, Type conformingReplacementType, PackConformance::get(conformingPack, conformedProtocol, conformances)); } + // All conformances for invertible protocols are builtin, so they're already + // abstract in a sense. + if (conformedProtocol->getInvertibleProtocolKind()) { + auto &ctx = conformedProtocol->getASTContext(); + return ProtocolConformanceRef( + ctx.getBuiltinConformance(conformingReplacementType, conformedProtocol, + BuiltinConformanceKind::Synthesized)); + } + assert((conformingReplacementType->is() || conformingReplacementType->is() || conformingReplacementType->is() || From 0ef804134bd15d6524d61149572b7162fd5dc618 Mon Sep 17 00:00:00 2001 From: Kavon Farvardin Date: Thu, 28 Mar 2024 13:16:29 -0700 Subject: [PATCH 2/2] NCGenerics: change notion of identity map --- lib/AST/SubstitutionMap.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/AST/SubstitutionMap.cpp b/lib/AST/SubstitutionMap.cpp index 807371a7c9717..f318a0e808231 100644 --- a/lib/AST/SubstitutionMap.cpp +++ b/lib/AST/SubstitutionMap.cpp @@ -832,6 +832,15 @@ bool SubstitutionMap::isIdentity() const { continue; } + // Is it a builtin conformance to an invertible protocol? + if (conf.isConcrete() + && conf.getRequirement()->getInvertibleProtocolKind()) { + ProtocolConformance *concreteConf = conf.getConcrete(); + RootProtocolConformance *rootConf = concreteConf->getRootConformance(); + if (isa(rootConf)) + continue; + } + return false; }