Skip to content

Commit ddd746b

Browse files
authored
Merge pull request #40466 from slavapestov/gsb-no-requirement-inference-in-protocols
[Experiment] GSB: Disable conditional requirement inference in protocols
2 parents 3495937 + d993e02 commit ddd746b

File tree

3 files changed

+33
-3
lines changed

3 files changed

+33
-3
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,9 @@ struct GenericSignatureBuilder::Implementation {
680680
/// requirements.
681681
bool RebuildingWithoutRedundantConformances = false;
682682

683+
/// Whether we are building a protocol requirement signature.
684+
bool BuildingProtocolRequirementSignature = false;
685+
683686
/// A mapping of redundant explicit requirements to the best root requirement
684687
/// that implies them. Built by computeRedundantRequirements().
685688
using RedundantRequirementMap =
@@ -2313,6 +2316,11 @@ void GenericSignatureBuilder::addConditionalRequirements(
23132316
if (Impl->RebuildingWithoutRedundantConformances)
23142317
return;
23152318

2319+
// We do not perform requirement inference, including conditional requirement
2320+
// inference, inside protocols.
2321+
if (Impl->BuildingProtocolRequirementSignature)
2322+
return;
2323+
23162324
// Abstract conformances don't have associated decl-contexts/modules, but also
23172325
// don't have conditional requirements.
23182326
if (conformance.isConcrete()) {
@@ -3399,10 +3407,12 @@ void EquivalenceClass::modified(GenericSignatureBuilder &builder) {
33993407
}
34003408

34013409
GenericSignatureBuilder::GenericSignatureBuilder(
3402-
ASTContext &ctx)
3410+
ASTContext &ctx,
3411+
bool requirementSignature)
34033412
: Context(ctx), Diags(Context.Diags), Impl(new Implementation) {
34043413
if (auto *Stats = Context.Stats)
34053414
++Stats->getFrontendCounters().NumGenericSignatureBuilders;
3415+
Impl->BuildingProtocolRequirementSignature = requirementSignature;
34063416
}
34073417

34083418
GenericSignatureBuilder::GenericSignatureBuilder(
@@ -8835,7 +8845,8 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
88358845
}
88368846

88378847
auto buildViaGSB = [&]() {
8838-
GenericSignatureBuilder builder(proto->getASTContext());
8848+
GenericSignatureBuilder builder(proto->getASTContext(),
8849+
/*requirementSignature=*/true);
88398850

88408851
// Add all of the generic parameters.
88418852
for (auto gp : *proto->getGenericParams())

lib/AST/GenericSignatureBuilder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,8 @@ class GenericSignatureBuilder {
496496

497497
public:
498498
/// Construct a new generic signature builder.
499-
explicit GenericSignatureBuilder(ASTContext &ctx);
499+
explicit GenericSignatureBuilder(ASTContext &ctx,
500+
bool requirementSignature=false);
500501
GenericSignatureBuilder(GenericSignatureBuilder &&);
501502
~GenericSignatureBuilder();
502503

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// RUN: %target-typecheck-verify-swift
2+
// RUN: %target-swift-frontend -typecheck %s -debug-generic-signatures 2>&1 | %FileCheck %s
3+
4+
// CHECK-LABEL: conditional_requirement_inference_in_protocol.(file).Good@
5+
// CHECK-LABEL: Requirement signature: <Self where Self.T == Array<Self.U>, Self.U : Equatable>
6+
7+
protocol Good {
8+
associatedtype T : Equatable // expected-warning {{redundant conformance constraint 'Self.T' : 'Equatable'}}
9+
associatedtype U : Equatable where T == Array<U> // expected-note {{conformance constraint 'Self.T' : 'Equatable' implied here}}
10+
}
11+
12+
// CHECK-LABEL: conditional_requirement_inference_in_protocol.(file).Bad@
13+
// CHECK-LABEL: Requirement signature: <Self where Self.T == Array<Self.U>>
14+
15+
protocol Bad {
16+
associatedtype T : Equatable // expected-warning {{redundant conformance constraint 'Self.T' : 'Equatable'}}
17+
associatedtype U where T == Array<U> // expected-note {{conformance constraint 'Self.T' : 'Equatable' implied here}}
18+
}

0 commit comments

Comments
 (0)