@@ -63,6 +63,10 @@ void RequirementSource::dump(llvm::raw_ostream &out,
6363 case Inherited:
6464 out << " inherited" ;
6565 break ;
66+
67+ case ProtocolRequirementSignatureSelf:
68+ out << " protocol_requirement_signature_self" ;
69+ break ;
6670 }
6771
6872 if (srcMgr && getLoc ().isValid ()) {
@@ -760,6 +764,7 @@ Type ArchetypeBuilder::PotentialArchetype::getTypeInContext(
760764 case RequirementSource::Explicit:
761765 case RequirementSource::Inferred:
762766 case RequirementSource::Protocol:
767+ case RequirementSource::ProtocolRequirementSignatureSelf:
763768 case RequirementSource::Redundant:
764769 Protos.push_back (conforms.first );
765770 break ;
@@ -1009,8 +1014,14 @@ bool ArchetypeBuilder::addConformanceRequirement(PotentialArchetype *PAT,
10091014 if (!T->addConformance (Proto, /* updateExistingSource=*/ true , Source, *this ))
10101015 return false ;
10111016
1012- RequirementSource InnerSource (RequirementSource::Redundant, Source.getLoc ());
1013-
1017+ // Conformances to inherit protocols are explicit in a protocol requirement
1018+ // signature, but inferred from this conformance otherwise.
1019+ auto InnerKind =
1020+ Source.getKind () == RequirementSource::ProtocolRequirementSignatureSelf
1021+ ? RequirementSource::Explicit
1022+ : RequirementSource::Redundant;
1023+ RequirementSource InnerSource (InnerKind, Source.getLoc ());
1024+
10141025 bool inserted = Visited.insert (Proto).second ;
10151026 assert (inserted);
10161027 (void ) inserted;
@@ -1031,10 +1042,15 @@ bool ArchetypeBuilder::addConformanceRequirement(PotentialArchetype *PAT,
10311042 if (auto AssocType = dyn_cast<AssociatedTypeDecl>(Member)) {
10321043 // Add requirements placed directly on this associated type.
10331044 auto AssocPA = T->getNestedType (AssocType, *this );
1045+ // Requirements introduced by the main protocol are explicit in a protocol
1046+ // requirement signature, but inferred from this conformance otherwise.
1047+ auto Kind = Source.getKind () ==
1048+ RequirementSource::ProtocolRequirementSignatureSelf
1049+ ? RequirementSource::Explicit
1050+ : RequirementSource::Protocol;
1051+
10341052 if (AssocPA != T) {
1035- if (addAbstractTypeParamRequirements (AssocType, AssocPA,
1036- RequirementSource::Protocol,
1037- Visited))
1053+ if (addAbstractTypeParamRequirements (AssocType, AssocPA, Kind, Visited))
10381054 return true ;
10391055 }
10401056
@@ -2067,7 +2083,7 @@ void ArchetypeBuilder::dump(llvm::raw_ostream &out) {
20672083
20682084void ArchetypeBuilder::addGenericSignature (GenericSignature *sig) {
20692085 if (!sig) return ;
2070-
2086+
20712087 RequirementSource::Kind sourceKind = RequirementSource::Explicit;
20722088 for (auto param : sig->getGenericParams ())
20732089 addGenericParameter (param);
@@ -2097,6 +2113,7 @@ static void collectRequirements(ArchetypeBuilder &builder,
20972113 case RequirementSource::Protocol:
20982114 case RequirementSource::Redundant:
20992115 case RequirementSource::Inherited:
2116+ case RequirementSource::ProtocolRequirementSignatureSelf:
21002117 // The requirement was redundant, drop it.
21012118 return ;
21022119 }
0 commit comments