Skip to content

Commit 7442e3a

Browse files
committed
GSB: Use a SmallSetVector to store the explicit requirements
We can literally have duplicate requirements (same source and RHS) when abstract signatures are built from scratch. They're not flagged as "redundant" since there's no way to distinguish them in the requirement graph, so just filter them out entirely.
1 parent 3fe2534 commit 7442e3a

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,7 @@ struct GenericSignatureBuilder::Implementation {
698698
bool HadAnyError = false;
699699

700700
/// All explicit non-same type requirements that were added to the builder.
701-
SmallVector<ExplicitRequirement, 2> ExplicitRequirements;
701+
SmallSetVector<ExplicitRequirement, 2> ExplicitRequirements;
702702

703703
/// All explicit same-type requirements that were added to the builder.
704704
SmallVector<Requirement, 2> ExplicitSameTypeRequirements;
@@ -4507,8 +4507,9 @@ ConstraintResult GenericSignatureBuilder::addConformanceRequirement(
45074507
auto resolvedSource = source.getSource(*this, type);
45084508

45094509
if (!resolvedSource->isDerivedRequirement()) {
4510-
Impl->ExplicitRequirements.emplace_back(RequirementKind::Conformance,
4511-
resolvedSource, proto);
4510+
Impl->ExplicitRequirements.insert(
4511+
ExplicitRequirement(RequirementKind::Conformance,
4512+
resolvedSource, proto));
45124513
}
45134514

45144515
// Add the conformance requirement, bailing out earlier if we've already
@@ -4529,8 +4530,9 @@ ConstraintResult GenericSignatureBuilder::addLayoutRequirementDirect(
45294530
auto resolvedSource = source.getSource(*this, type);
45304531

45314532
if (!resolvedSource->isDerivedRequirement()) {
4532-
Impl->ExplicitRequirements.emplace_back(RequirementKind::Layout,
4533-
resolvedSource, layout);
4533+
Impl->ExplicitRequirements.insert(
4534+
ExplicitRequirement(RequirementKind::Layout,
4535+
resolvedSource, layout));
45344536
}
45354537

45364538
auto equivClass = type.getEquivalenceClass(*this);
@@ -4670,8 +4672,9 @@ ConstraintResult GenericSignatureBuilder::addSuperclassRequirementDirect(
46704672
auto resolvedSource = source.getSource(*this, type);
46714673

46724674
if (!resolvedSource->isDerivedRequirement()) {
4673-
Impl->ExplicitRequirements.emplace_back(RequirementKind::Superclass,
4674-
resolvedSource, superclass);
4675+
Impl->ExplicitRequirements.insert(
4676+
ExplicitRequirement(RequirementKind::Superclass,
4677+
resolvedSource, superclass));
46754678
}
46764679

46774680
// Record the constraint.

0 commit comments

Comments
 (0)