@@ -669,6 +669,10 @@ struct GenericSignatureBuilder::Implementation {
669
669
// / All explicit same-type requirements that were added to the builder.
670
670
SmallVector<ExplicitRequirement, 2 > ExplicitSameTypeRequirements;
671
671
672
+ // / Whether we are rebuilding a signature without redundant conformance
673
+ // / requirements.
674
+ bool RebuildingWithoutRedundantConformances = false ;
675
+
672
676
// / A mapping of redundant explicit requirements to the best root requirement
673
677
// / that implies them. Built by computeRedundantRequirements().
674
678
using RedundantRequirementMap =
@@ -2470,6 +2474,14 @@ ConstraintResult GenericSignatureBuilder::handleUnresolvedRequirement(
2470
2474
2471
2475
void GenericSignatureBuilder::addConditionalRequirements (
2472
2476
ProtocolConformanceRef conformance, ModuleDecl *inferForModule) {
2477
+ // When rebuilding a signature, don't add requirements inferred from conditional
2478
+ // conformances, since we've already added them to our ExplicitRequirements list.
2479
+ //
2480
+ // FIXME: We need to handle conditional conformances earlier, in the same place
2481
+ // as other forms of requirement inference, to eliminate this bit of state.
2482
+ if (Impl->RebuildingWithoutRedundantConformances )
2483
+ return ;
2484
+
2473
2485
// Abstract conformances don't have associated decl-contexts/modules, but also
2474
2486
// don't have conditional requirements.
2475
2487
if (conformance.isConcrete ()) {
@@ -8384,6 +8396,7 @@ GenericSignature GenericSignatureBuilder::rebuildSignatureWithoutRedundantRequir
8384
8396
NumSignaturesRebuiltWithoutRedundantRequirements++;
8385
8397
8386
8398
GenericSignatureBuilder newBuilder (Context);
8399
+ newBuilder.Impl ->RebuildingWithoutRedundantConformances = true ;
8387
8400
8388
8401
for (auto param : getGenericParams ())
8389
8402
newBuilder.addGenericParameter (param);
@@ -8487,20 +8500,18 @@ GenericSignature GenericSignatureBuilder::rebuildSignatureWithoutRedundantRequir
8487
8500
// Build a new signature using the new builder.
8488
8501
return std::move (newBuilder).computeGenericSignature (
8489
8502
allowConcreteGenericParams,
8490
- requirementSignatureSelfProto,
8491
- /* rebuildingWithoutRedundantConformances=*/ true );
8503
+ requirementSignatureSelfProto);
8492
8504
}
8493
8505
8494
8506
GenericSignature GenericSignatureBuilder::computeGenericSignature (
8495
8507
bool allowConcreteGenericParams,
8496
- const ProtocolDecl *requirementSignatureSelfProto,
8497
- bool rebuildingWithoutRedundantConformances) && {
8508
+ const ProtocolDecl *requirementSignatureSelfProto) && {
8498
8509
// Finalize the builder, producing any necessary diagnostics.
8499
8510
finalize (getGenericParams (),
8500
8511
allowConcreteGenericParams,
8501
8512
requirementSignatureSelfProto);
8502
8513
8503
- if (rebuildingWithoutRedundantConformances ) {
8514
+ if (Impl-> RebuildingWithoutRedundantConformances ) {
8504
8515
assert (!Impl->HadAnyError &&
8505
8516
" Rebuilt signature had errors" );
8506
8517
@@ -8521,7 +8532,7 @@ GenericSignature GenericSignatureBuilder::computeGenericSignature(
8521
8532
// we might end up emitting duplicate diagnostics.
8522
8533
//
8523
8534
// Also, don't do this when building a requirement signature.
8524
- if (!rebuildingWithoutRedundantConformances &&
8535
+ if (!Impl-> RebuildingWithoutRedundantConformances &&
8525
8536
!Impl->HadAnyError &&
8526
8537
!Impl->ExplicitConformancesImpliedByConcrete .empty ()) {
8527
8538
return std::move (*this ).rebuildSignatureWithoutRedundantRequirements (
0 commit comments