Skip to content

Commit 7ce6504

Browse files
committed
[RequirementMachine] Avoid passing the requirement error vector through
initialization of the rewrite system. Instead, the rewrite system can determine trivially redundant requirements by finding structural requirements with no associated rewrite rules.
1 parent 0085eb0 commit 7ce6504

File tree

7 files changed

+33
-41
lines changed

7 files changed

+33
-41
lines changed

lib/AST/RequirementMachine/ConcreteTypeWitness.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,7 @@ void PropertyMap::inferConditionalRequirements(
581581
for (const auto &rule : builder.RequirementRules) {
582582
auto lhs = std::get<0>(rule);
583583
auto rhs = std::get<1>(rule);
584-
System.addExplicitRule(lhs, rhs, /*requirementID=*/None, errors);
584+
System.addExplicitRule(lhs, rhs, /*requirementID=*/None);
585585
}
586586
}
587587
}

lib/AST/RequirementMachine/RequirementMachine.cpp

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,7 @@ void RequirementMachine::checkCompletionResult(CompletionResult result) const {
7575
///
7676
/// Returns failure if completion fails within the configured number of steps.
7777
std::pair<CompletionResult, unsigned>
78-
RequirementMachine::initWithGenericSignature(CanGenericSignature sig,
79-
SmallVectorImpl<RequirementError> &errors) {
78+
RequirementMachine::initWithGenericSignature(CanGenericSignature sig) {
8079
Sig = sig;
8180
Params.append(sig.getGenericParams().begin(),
8281
sig.getGenericParams().end());
@@ -99,8 +98,7 @@ RequirementMachine::initWithGenericSignature(CanGenericSignature sig,
9998
/*protos=*/ArrayRef<const ProtocolDecl *>(),
10099
std::move(builder.WrittenRequirements),
101100
std::move(builder.PermanentRules),
102-
std::move(builder.RequirementRules),
103-
errors);
101+
std::move(builder.RequirementRules));
104102

105103
auto result = computeCompletion(RewriteSystem::DisallowInvalidRequirements);
106104

@@ -125,8 +123,7 @@ RequirementMachine::initWithGenericSignature(CanGenericSignature sig,
125123
///
126124
/// Returns failure if completion fails within the configured number of steps.
127125
std::pair<CompletionResult, unsigned>
128-
RequirementMachine::initWithProtocols(ArrayRef<const ProtocolDecl *> protos,
129-
SmallVectorImpl<RequirementError> &errors) {
126+
RequirementMachine::initWithProtocols(ArrayRef<const ProtocolDecl *> protos) {
130127
FrontendStatsTracer tracer(Stats, "build-rewrite-system");
131128

132129
if (Dump) {
@@ -144,8 +141,7 @@ RequirementMachine::initWithProtocols(ArrayRef<const ProtocolDecl *> protos,
144141
System.initialize(/*recordLoops=*/true, protos,
145142
std::move(builder.WrittenRequirements),
146143
std::move(builder.PermanentRules),
147-
std::move(builder.RequirementRules),
148-
errors);
144+
std::move(builder.RequirementRules));
149145

150146
auto result = computeCompletion(RewriteSystem::AllowInvalidRequirements);
151147

@@ -171,8 +167,7 @@ RequirementMachine::initWithProtocols(ArrayRef<const ProtocolDecl *> protos,
171167
std::pair<CompletionResult, unsigned>
172168
RequirementMachine::initWithWrittenRequirements(
173169
ArrayRef<GenericTypeParamType *> genericParams,
174-
ArrayRef<StructuralRequirement> requirements,
175-
SmallVectorImpl<RequirementError> &errors) {
170+
ArrayRef<StructuralRequirement> requirements) {
176171
Params.append(genericParams.begin(), genericParams.end());
177172

178173
FrontendStatsTracer tracer(Stats, "build-rewrite-system");
@@ -194,8 +189,7 @@ RequirementMachine::initWithWrittenRequirements(
194189
/*protos=*/ArrayRef<const ProtocolDecl *>(),
195190
std::move(builder.WrittenRequirements),
196191
std::move(builder.PermanentRules),
197-
std::move(builder.RequirementRules),
198-
errors);
192+
std::move(builder.RequirementRules));
199193

200194
auto result = computeCompletion(RewriteSystem::AllowInvalidRequirements);
201195

lib/AST/RequirementMachine/RequirementMachine.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,18 +91,15 @@ class RequirementMachine final {
9191
void checkCompletionResult(CompletionResult result) const;
9292

9393
std::pair<CompletionResult, unsigned>
94-
initWithGenericSignature(CanGenericSignature sig,
95-
SmallVectorImpl<RequirementError> &errors);
94+
initWithGenericSignature(CanGenericSignature sig);
9695

9796
std::pair<CompletionResult, unsigned>
98-
initWithProtocols(ArrayRef<const ProtocolDecl *> protos,
99-
SmallVectorImpl<RequirementError> &errors);
97+
initWithProtocols(ArrayRef<const ProtocolDecl *> protos);
10098

10199
std::pair<CompletionResult, unsigned>
102100
initWithWrittenRequirements(
103101
ArrayRef<GenericTypeParamType *> genericParams,
104-
ArrayRef<StructuralRequirement> requirements,
105-
SmallVectorImpl<RequirementError> &errors);
102+
ArrayRef<StructuralRequirement> requirements);
106103

107104
bool isComplete() const;
108105

lib/AST/RequirementMachine/RequirementMachineRequests.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ RequirementSignatureRequestRQM::evaluate(Evaluator &evaluator,
354354

355355
SmallVector<RequirementError, 4> errors;
356356

357-
auto status = machine->initWithProtocols(component, errors);
357+
auto status = machine->initWithProtocols(component);
358358
if (status.first != CompletionResult::Success) {
359359
// All we can do at this point is diagnose and give each protocol an empty
360360
// requirement signature.
@@ -524,7 +524,7 @@ AbstractGenericSignatureRequestRQM::evaluate(
524524
ctx.getRewriteContext()));
525525

526526
auto status =
527-
machine->initWithWrittenRequirements(genericParams, requirements, errors);
527+
machine->initWithWrittenRequirements(genericParams, requirements);
528528
machine->checkCompletionResult(status.first);
529529

530530
auto minimalRequirements =
@@ -652,7 +652,7 @@ InferredGenericSignatureRequestRQM::evaluate(
652652
ctx.getRewriteContext()));
653653

654654
auto status =
655-
machine->initWithWrittenRequirements(genericParams, requirements, errors);
655+
machine->initWithWrittenRequirements(genericParams, requirements);
656656
if (status.first != CompletionResult::Success) {
657657
ctx.Diags.diagnose(loc,
658658
diag::requirement_machine_completion_failed,

lib/AST/RequirementMachine/RewriteContext.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,9 @@ RequirementMachine *RewriteContext::getRequirementMachine(
133133
auto *newMachine = new rewriting::RequirementMachine(*this);
134134
machine = newMachine;
135135

136-
SmallVector<RequirementError, 4> errors;
137-
138136
// This might re-entrantly invalidate 'machine', which is a reference
139137
// into Protos.
140-
auto status = newMachine->initWithGenericSignature(sig, errors);
138+
auto status = newMachine->initWithGenericSignature(sig);
141139
newMachine->checkCompletionResult(status.first);
142140

143141
return newMachine;

lib/AST/RequirementMachine/RewriteSystem.cpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,7 @@ void RewriteSystem::initialize(
279279
ArrayRef<StructuralRequirement> writtenRequirements,
280280
std::vector<std::pair<MutableTerm, MutableTerm>> &&permanentRules,
281281
std::vector<std::tuple<MutableTerm, MutableTerm, Optional<unsigned>>>
282-
&&requirementRules,
283-
SmallVectorImpl<RequirementError> &errors) {
282+
&&requirementRules) {
284283
assert(!Initialized);
285284
Initialized = 1;
286285

@@ -295,7 +294,7 @@ void RewriteSystem::initialize(
295294
auto lhs = std::get<0>(rule);
296295
auto rhs = std::get<1>(rule);
297296
auto requirementID = std::get<2>(rule);
298-
addExplicitRule(lhs, rhs, requirementID, errors);
297+
addExplicitRule(lhs, rhs, requirementID);
299298
}
300299
}
301300

@@ -496,16 +495,11 @@ bool RewriteSystem::addPermanentRule(MutableTerm lhs, MutableTerm rhs) {
496495

497496
/// Add a new rule, marking it explicit.
498497
bool RewriteSystem::addExplicitRule(MutableTerm lhs, MutableTerm rhs,
499-
Optional<unsigned> requirementID,
500-
SmallVectorImpl<RequirementError> &errors) {
498+
Optional<unsigned> requirementID) {
501499
bool added = addRule(std::move(lhs), std::move(rhs));
502500
if (added) {
503501
Rules.back().markExplicit();
504502
Rules.back().setRequirementID(requirementID);
505-
} else if (requirementID.hasValue()) {
506-
auto req = WrittenRequirements[requirementID.getValue()];
507-
errors.push_back(
508-
RequirementError::forRedundantRequirement(req.req, req.loc));
509503
}
510504

511505
return added;
@@ -784,12 +778,23 @@ void RewriteSystem::computeRedundantRequirementDiagnostics(
784778
return rule.isRedundant();
785779
};
786780

787-
for (auto pair : rulesPerRequirement) {
788-
unsigned requirementID = pair.first;
789-
auto ruleIDs = pair.second;
781+
for (auto requirementID : indices(WrittenRequirements)) {
782+
auto requirement = WrittenRequirements[requirementID];
783+
auto pairIt = rulesPerRequirement.find(requirementID);
784+
785+
// If there are no rules for this structural requirement, then
786+
// the requirement was never added to the rewrite system because
787+
// it is trivially redundant.
788+
if (pairIt == rulesPerRequirement.end()) {
789+
errors.push_back(
790+
RequirementError::forRedundantRequirement(requirement.req,
791+
requirement.loc));
792+
continue;
793+
}
790794

791795
// If all rules derived from this structural requirement are redundant,
792796
// then the requirement is unnecessary in the source code.
797+
auto ruleIDs = pairIt->second;
793798
if (llvm::all_of(ruleIDs, isRedundantRule)) {
794799
auto requirement = WrittenRequirements[requirementID];
795800
errors.push_back(

lib/AST/RequirementMachine/RewriteSystem.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -302,8 +302,7 @@ class RewriteSystem final {
302302
void initialize(bool recordLoops, ArrayRef<const ProtocolDecl *> protos,
303303
ArrayRef<StructuralRequirement> writtenRequirements,
304304
std::vector<std::pair<MutableTerm, MutableTerm>> &&permanentRules,
305-
std::vector<std::tuple<MutableTerm, MutableTerm, Optional<unsigned>>> &&requirementRules,
306-
SmallVectorImpl<RequirementError> &errors);
305+
std::vector<std::tuple<MutableTerm, MutableTerm, Optional<unsigned>>> &&requirementRules);
307306

308307
ArrayRef<const ProtocolDecl *> getProtocols() const {
309308
return Protos;
@@ -336,8 +335,7 @@ class RewriteSystem final {
336335
bool addPermanentRule(MutableTerm lhs, MutableTerm rhs);
337336

338337
bool addExplicitRule(MutableTerm lhs, MutableTerm rhs,
339-
Optional<unsigned> requirementID,
340-
SmallVectorImpl<RequirementError> &errors);
338+
Optional<unsigned> requirementID);
341339

342340
bool simplify(MutableTerm &term, RewritePath *path=nullptr) const;
343341

0 commit comments

Comments
 (0)