Skip to content

Commit c746758

Browse files
committed
GSB: Don't infer requirements from conditional conformances when rebuilding a signature
1 parent 3378ff9 commit c746758

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

include/swift/AST/GenericSignatureBuilder.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -624,8 +624,7 @@ class GenericSignatureBuilder {
624624
/// generic signature builder no longer has valid state.
625625
GenericSignature computeGenericSignature(
626626
bool allowConcreteGenericParams = false,
627-
const ProtocolDecl *requirementSignatureSelfProto = nullptr,
628-
bool rebuildingWithoutRedundantConformances = false) &&;
627+
const ProtocolDecl *requirementSignatureSelfProto = nullptr) &&;
629628

630629
/// Compute the requirement signature for the given protocol.
631630
static GenericSignature computeRequirementSignature(ProtocolDecl *proto);

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,10 @@ struct GenericSignatureBuilder::Implementation {
669669
/// All explicit same-type requirements that were added to the builder.
670670
SmallVector<ExplicitRequirement, 2> ExplicitSameTypeRequirements;
671671

672+
/// Whether we are rebuilding a signature without redundant conformance
673+
/// requirements.
674+
bool RebuildingWithoutRedundantConformances = false;
675+
672676
/// A mapping of redundant explicit requirements to the best root requirement
673677
/// that implies them. Built by computeRedundantRequirements().
674678
using RedundantRequirementMap =
@@ -2470,6 +2474,14 @@ ConstraintResult GenericSignatureBuilder::handleUnresolvedRequirement(
24702474

24712475
void GenericSignatureBuilder::addConditionalRequirements(
24722476
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+
24732485
// Abstract conformances don't have associated decl-contexts/modules, but also
24742486
// don't have conditional requirements.
24752487
if (conformance.isConcrete()) {
@@ -8384,6 +8396,7 @@ GenericSignature GenericSignatureBuilder::rebuildSignatureWithoutRedundantRequir
83848396
NumSignaturesRebuiltWithoutRedundantRequirements++;
83858397

83868398
GenericSignatureBuilder newBuilder(Context);
8399+
newBuilder.Impl->RebuildingWithoutRedundantConformances = true;
83878400

83888401
for (auto param : getGenericParams())
83898402
newBuilder.addGenericParameter(param);
@@ -8487,20 +8500,18 @@ GenericSignature GenericSignatureBuilder::rebuildSignatureWithoutRedundantRequir
84878500
// Build a new signature using the new builder.
84888501
return std::move(newBuilder).computeGenericSignature(
84898502
allowConcreteGenericParams,
8490-
requirementSignatureSelfProto,
8491-
/*rebuildingWithoutRedundantConformances=*/true);
8503+
requirementSignatureSelfProto);
84928504
}
84938505

84948506
GenericSignature GenericSignatureBuilder::computeGenericSignature(
84958507
bool allowConcreteGenericParams,
8496-
const ProtocolDecl *requirementSignatureSelfProto,
8497-
bool rebuildingWithoutRedundantConformances) && {
8508+
const ProtocolDecl *requirementSignatureSelfProto) && {
84988509
// Finalize the builder, producing any necessary diagnostics.
84998510
finalize(getGenericParams(),
85008511
allowConcreteGenericParams,
85018512
requirementSignatureSelfProto);
85028513

8503-
if (rebuildingWithoutRedundantConformances) {
8514+
if (Impl->RebuildingWithoutRedundantConformances) {
85048515
assert(!Impl->HadAnyError &&
85058516
"Rebuilt signature had errors");
85068517

@@ -8521,7 +8532,7 @@ GenericSignature GenericSignatureBuilder::computeGenericSignature(
85218532
// we might end up emitting duplicate diagnostics.
85228533
//
85238534
// Also, don't do this when building a requirement signature.
8524-
if (!rebuildingWithoutRedundantConformances &&
8535+
if (!Impl->RebuildingWithoutRedundantConformances &&
85258536
!Impl->HadAnyError &&
85268537
!Impl->ExplicitConformancesImpliedByConcrete.empty()) {
85278538
return std::move(*this).rebuildSignatureWithoutRedundantRequirements(

0 commit comments

Comments
 (0)