@@ -1005,7 +1005,7 @@ static Type replaceSelfWithType(Type selfType, Type depTy) {
10051005// / occurs within the requirement signature of its own protocol.
10061006static bool isSelfDerivedProtocolRequirementInProtocol (
10071007 const RequirementSource *source,
1008- ProtocolDecl *selfProto,
1008+ const ProtocolDecl *selfProto,
10091009 GenericSignatureBuilder &builder) {
10101010 assert (source->isProtocolRequirement ());
10111011
@@ -1069,7 +1069,7 @@ const RequirementSource *RequirementSource::getMinimalConformanceSource(
10691069 };
10701070
10711071 bool sawProtocolRequirement = false ;
1072- ProtocolDecl *requirementSignatureSelfProto = nullptr ;
1072+ const ProtocolDecl *requirementSignatureSelfProto = nullptr ;
10731073
10741074 Type rootType = nullptr ;
10751075 Optional<std::pair<const RequirementSource *, const RequirementSource *>>
@@ -6279,7 +6279,8 @@ static bool isConcreteConformance(const EquivalenceClass &equivClass,
62796279 return false ;
62806280}
62816281
6282- void GenericSignatureBuilder::computeRedundantRequirements () {
6282+ void GenericSignatureBuilder::computeRedundantRequirements (
6283+ const ProtocolDecl *requirementSignatureSelfProto) {
62836284 assert (!Impl->computedRedundantRequirements &&
62846285 " Already computed redundant requirements" );
62856286#ifndef NDEBUG
@@ -6534,11 +6535,12 @@ void GenericSignatureBuilder::computeRedundantRequirements() {
65346535
65356536void
65366537GenericSignatureBuilder::finalize (TypeArrayView<GenericTypeParamType> genericParams,
6537- bool allowConcreteGenericParams) {
6538+ bool allowConcreteGenericParams,
6539+ const ProtocolDecl *requirementSignatureSelfProto) {
65386540 // Process any delayed requirements that we can handle now.
65396541 processDelayedRequirements ();
65406542
6541- computeRedundantRequirements ();
6543+ computeRedundantRequirements (requirementSignatureSelfProto );
65426544 diagnoseRedundantRequirements ();
65436545 diagnoseConflictingConcreteTypeRequirements ();
65446546
@@ -8547,7 +8549,7 @@ static Requirement stripBoundDependentMemberTypes(Requirement req) {
85478549
85488550GenericSignature GenericSignatureBuilder::rebuildSignatureWithoutRedundantRequirements (
85498551 bool allowConcreteGenericParams,
8550- bool buildingRequirementSignature ) && {
8552+ const ProtocolDecl *requirementSignatureSelfProto ) && {
85518553 NumSignaturesRebuiltWithoutRedundantRequirements++;
85528554
85538555 GenericSignatureBuilder newBuilder (Context);
@@ -8630,19 +8632,20 @@ GenericSignature GenericSignatureBuilder::rebuildSignatureWithoutRedundantRequir
86308632 // Build a new signature using the new builder.
86318633 return std::move (newBuilder).computeGenericSignature (
86328634 allowConcreteGenericParams,
8633- buildingRequirementSignature ,
8635+ requirementSignatureSelfProto ,
86348636 /* rebuildingWithoutRedundantConformances=*/ true );
86358637}
86368638
86378639GenericSignature GenericSignatureBuilder::computeGenericSignature (
86388640 bool allowConcreteGenericParams,
8639- bool buildingRequirementSignature ,
8641+ const ProtocolDecl *requirementSignatureSelfProto ,
86408642 bool rebuildingWithoutRedundantConformances) && {
86418643 // Finalize the builder, producing any necessary diagnostics.
8642- finalize (getGenericParams (), allowConcreteGenericParams);
8644+ finalize (getGenericParams (), allowConcreteGenericParams,
8645+ requirementSignatureSelfProto);
86438646
86448647 if (rebuildingWithoutRedundantConformances) {
8645- assert (!buildingRequirementSignature &&
8648+ assert (requirementSignatureSelfProto == nullptr &&
86468649 " Rebuilding a requirement signature?" );
86478650
86488651 assert (!Impl->HadAnyError &&
@@ -8666,12 +8669,12 @@ GenericSignature GenericSignatureBuilder::computeGenericSignature(
86668669 //
86678670 // Also, don't do this when building a requirement signature.
86688671 if (!rebuildingWithoutRedundantConformances &&
8669- !buildingRequirementSignature &&
8672+ requirementSignatureSelfProto == nullptr &&
86708673 !Impl->HadAnyError &&
86718674 !Impl->ExplicitConformancesImpliedByConcrete .empty ()) {
86728675 return std::move (*this ).rebuildSignatureWithoutRedundantRequirements (
86738676 allowConcreteGenericParams,
8674- buildingRequirementSignature );
8677+ requirementSignatureSelfProto );
86758678 }
86768679
86778680 // Collect the requirements placed on the generic parameter types.
@@ -8694,7 +8697,8 @@ GenericSignature GenericSignatureBuilder::computeGenericSignature(
86948697 // We cannot do this when there were errors.
86958698 //
86968699 // Also, we cannot do this when building a requirement signature.
8697- if (!buildingRequirementSignature && !Impl->HadAnyError ) {
8700+ if (requirementSignatureSelfProto == nullptr &&
8701+ !Impl->HadAnyError ) {
86988702 // Register this generic signature builder as the canonical builder for the
86998703 // given signature.
87008704 Context.registerGenericSignatureBuilder (sig, std::move (*this ));
0 commit comments