@@ -1005,7 +1005,7 @@ static Type replaceSelfWithType(Type selfType, Type depTy) {
1005
1005
// / occurs within the requirement signature of its own protocol.
1006
1006
static bool isSelfDerivedProtocolRequirementInProtocol (
1007
1007
const RequirementSource *source,
1008
- ProtocolDecl *selfProto,
1008
+ const ProtocolDecl *selfProto,
1009
1009
GenericSignatureBuilder &builder) {
1010
1010
assert (source->isProtocolRequirement ());
1011
1011
@@ -1069,7 +1069,7 @@ const RequirementSource *RequirementSource::getMinimalConformanceSource(
1069
1069
};
1070
1070
1071
1071
bool sawProtocolRequirement = false ;
1072
- ProtocolDecl *requirementSignatureSelfProto = nullptr ;
1072
+ const ProtocolDecl *requirementSignatureSelfProto = nullptr ;
1073
1073
1074
1074
Type rootType = nullptr ;
1075
1075
Optional<std::pair<const RequirementSource *, const RequirementSource *>>
@@ -6279,7 +6279,8 @@ static bool isConcreteConformance(const EquivalenceClass &equivClass,
6279
6279
return false ;
6280
6280
}
6281
6281
6282
- void GenericSignatureBuilder::computeRedundantRequirements () {
6282
+ void GenericSignatureBuilder::computeRedundantRequirements (
6283
+ const ProtocolDecl *requirementSignatureSelfProto) {
6283
6284
assert (!Impl->computedRedundantRequirements &&
6284
6285
" Already computed redundant requirements" );
6285
6286
#ifndef NDEBUG
@@ -6534,11 +6535,12 @@ void GenericSignatureBuilder::computeRedundantRequirements() {
6534
6535
6535
6536
void
6536
6537
GenericSignatureBuilder::finalize (TypeArrayView<GenericTypeParamType> genericParams,
6537
- bool allowConcreteGenericParams) {
6538
+ bool allowConcreteGenericParams,
6539
+ const ProtocolDecl *requirementSignatureSelfProto) {
6538
6540
// Process any delayed requirements that we can handle now.
6539
6541
processDelayedRequirements ();
6540
6542
6541
- computeRedundantRequirements ();
6543
+ computeRedundantRequirements (requirementSignatureSelfProto );
6542
6544
diagnoseRedundantRequirements ();
6543
6545
diagnoseConflictingConcreteTypeRequirements ();
6544
6546
@@ -8547,7 +8549,7 @@ static Requirement stripBoundDependentMemberTypes(Requirement req) {
8547
8549
8548
8550
GenericSignature GenericSignatureBuilder::rebuildSignatureWithoutRedundantRequirements (
8549
8551
bool allowConcreteGenericParams,
8550
- bool buildingRequirementSignature ) && {
8552
+ const ProtocolDecl *requirementSignatureSelfProto ) && {
8551
8553
NumSignaturesRebuiltWithoutRedundantRequirements++;
8552
8554
8553
8555
GenericSignatureBuilder newBuilder (Context);
@@ -8630,19 +8632,20 @@ GenericSignature GenericSignatureBuilder::rebuildSignatureWithoutRedundantRequir
8630
8632
// Build a new signature using the new builder.
8631
8633
return std::move (newBuilder).computeGenericSignature (
8632
8634
allowConcreteGenericParams,
8633
- buildingRequirementSignature ,
8635
+ requirementSignatureSelfProto ,
8634
8636
/* rebuildingWithoutRedundantConformances=*/ true );
8635
8637
}
8636
8638
8637
8639
GenericSignature GenericSignatureBuilder::computeGenericSignature (
8638
8640
bool allowConcreteGenericParams,
8639
- bool buildingRequirementSignature ,
8641
+ const ProtocolDecl *requirementSignatureSelfProto ,
8640
8642
bool rebuildingWithoutRedundantConformances) && {
8641
8643
// Finalize the builder, producing any necessary diagnostics.
8642
- finalize (getGenericParams (), allowConcreteGenericParams);
8644
+ finalize (getGenericParams (), allowConcreteGenericParams,
8645
+ requirementSignatureSelfProto);
8643
8646
8644
8647
if (rebuildingWithoutRedundantConformances) {
8645
- assert (!buildingRequirementSignature &&
8648
+ assert (requirementSignatureSelfProto == nullptr &&
8646
8649
" Rebuilding a requirement signature?" );
8647
8650
8648
8651
assert (!Impl->HadAnyError &&
@@ -8666,12 +8669,12 @@ GenericSignature GenericSignatureBuilder::computeGenericSignature(
8666
8669
//
8667
8670
// Also, don't do this when building a requirement signature.
8668
8671
if (!rebuildingWithoutRedundantConformances &&
8669
- !buildingRequirementSignature &&
8672
+ requirementSignatureSelfProto == nullptr &&
8670
8673
!Impl->HadAnyError &&
8671
8674
!Impl->ExplicitConformancesImpliedByConcrete .empty ()) {
8672
8675
return std::move (*this ).rebuildSignatureWithoutRedundantRequirements (
8673
8676
allowConcreteGenericParams,
8674
- buildingRequirementSignature );
8677
+ requirementSignatureSelfProto );
8675
8678
}
8676
8679
8677
8680
// Collect the requirements placed on the generic parameter types.
@@ -8694,7 +8697,8 @@ GenericSignature GenericSignatureBuilder::computeGenericSignature(
8694
8697
// We cannot do this when there were errors.
8695
8698
//
8696
8699
// Also, we cannot do this when building a requirement signature.
8697
- if (!buildingRequirementSignature && !Impl->HadAnyError ) {
8700
+ if (requirementSignatureSelfProto == nullptr &&
8701
+ !Impl->HadAnyError ) {
8698
8702
// Register this generic signature builder as the canonical builder for the
8699
8703
// given signature.
8700
8704
Context.registerGenericSignatureBuilder (sig, std::move (*this ));
0 commit comments