Skip to content

Commit 35a2687

Browse files
committed
GSB: Pass down requirement signature protocol to computeGenericSignature()
1 parent 4652f06 commit 35a2687

File tree

3 files changed

+24
-19
lines changed

3 files changed

+24
-19
lines changed

include/swift/AST/GenericSignatureBuilder.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ class GenericSignatureBuilder {
624624

625625
GenericSignature rebuildSignatureWithoutRedundantRequirements(
626626
bool allowConcreteGenericParams,
627-
bool buildingRequirementSignature) &&;
627+
const ProtocolDecl *requirementSignatureSelfProto) &&;
628628

629629
/// Finalize the set of requirements and compute the generic
630630
/// signature.
@@ -633,7 +633,7 @@ class GenericSignatureBuilder {
633633
/// generic signature builder no longer has valid state.
634634
GenericSignature computeGenericSignature(
635635
bool allowConcreteGenericParams = false,
636-
bool buildingRequirementSignature = false,
636+
const ProtocolDecl *requirementSignatureSelfProto = nullptr,
637637
bool rebuildingWithoutRedundantConformances = false) &&;
638638

639639
/// Compute the requirement signature for the given protocol.
@@ -646,7 +646,8 @@ class GenericSignatureBuilder {
646646
/// \param allowConcreteGenericParams If true, allow generic parameters to
647647
/// be made concrete.
648648
void finalize(TypeArrayView<GenericTypeParamType> genericParams,
649-
bool allowConcreteGenericParams=false);
649+
bool allowConcreteGenericParams,
650+
const ProtocolDecl *requirementSignatureSelfProto);
650651

651652
public:
652653
/// Process any delayed requirements that can be handled now.
@@ -657,7 +658,7 @@ class GenericSignatureBuilder {
657658
bool isRedundantExplicitRequirement(const ExplicitRequirement &req) const;
658659

659660
private:
660-
void computeRedundantRequirements();
661+
void computeRedundantRequirements(const ProtocolDecl *requirementSignatureSelfProto);
661662

662663
void diagnoseRedundantRequirements() const;
663664

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,7 +1005,7 @@ static Type replaceSelfWithType(Type selfType, Type depTy) {
10051005
/// occurs within the requirement signature of its own protocol.
10061006
static 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

65356536
void
65366537
GenericSignatureBuilder::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

85488550
GenericSignature 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

86378639
GenericSignature 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));

lib/Sema/TypeCheckDecl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -929,7 +929,7 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
929929
proto->getSelfInterfaceType()->castTo<GenericTypeParamType>();
930930
auto requirement =
931931
Requirement(RequirementKind::Conformance, selfType,
932-
proto->getDeclaredInterfaceType());
932+
proto->getDeclaredInterfaceType());
933933

934934
builder.addRequirement(
935935
requirement,
@@ -939,7 +939,7 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
939939

940940
auto reqSignature = std::move(builder).computeGenericSignature(
941941
/*allowConcreteGenericParams=*/false,
942-
/*buildingRequirementSignature=*/true);
942+
/*requirementSignatureSelfProto=*/proto);
943943
return reqSignature->getRequirements();
944944
}
945945

0 commit comments

Comments
 (0)