@@ -1642,14 +1642,13 @@ bool EquivalenceClass::recordConformanceConstraint(
1642
1642
}
1643
1643
1644
1644
bool EquivalenceClass::recordSameTypeConstraint (
1645
- GenericSignatureBuilder &builder,
1646
1645
PotentialArchetype *type1,
1647
1646
PotentialArchetype *type2,
1648
1647
const RequirementSource *source) {
1649
- // FIXME: Drop builder?
1650
1648
sameTypeConstraints.push_back ({type1, type2, source});
1651
1649
++NumSameTypeConstraints;
1652
- return true ;
1650
+ return type1->getEquivalenceClassIfPresent () !=
1651
+ type2->getEquivalenceClassIfPresent ();
1653
1652
}
1654
1653
1655
1654
template <typename T>
@@ -3977,23 +3976,20 @@ GenericSignatureBuilder::addSameTypeRequirementBetweenArchetypes(
3977
3976
PotentialArchetype *OrigT2,
3978
3977
const RequirementSource *Source)
3979
3978
{
3979
+ // Record the same-type constraint, and bail out if it was already known.
3980
+ if (!OrigT1->getOrCreateEquivalenceClass (*this )
3981
+ ->recordSameTypeConstraint (OrigT1, OrigT2, Source))
3982
+ return ConstraintResult::Resolved;
3983
+
3980
3984
// Operate on the representatives
3981
3985
auto T1 = OrigT1->getRepresentative ();
3982
3986
auto T2 = OrigT2->getRepresentative ();
3983
3987
3984
- // If the representatives are already the same, we're done.
3985
- if (T1 == T2) {
3986
- T1->getOrCreateEquivalenceClass (*this )
3987
- ->recordSameTypeConstraint (*this , OrigT1, OrigT2, Source);
3988
- return ConstraintResult::Resolved;
3989
- }
3990
-
3991
- unsigned nestingDepth1 = T1->getNestingDepth ();
3992
- unsigned nestingDepth2 = T2->getNestingDepth ();
3993
-
3994
3988
// Decide which potential archetype is to be considered the representative.
3995
3989
// We prefer potential archetypes with lower nesting depths, because it
3996
3990
// prevents us from unnecessarily building deeply nested potential archetypes.
3991
+ unsigned nestingDepth1 = T1->getNestingDepth ();
3992
+ unsigned nestingDepth2 = T2->getNestingDepth ();
3997
3993
if (nestingDepth2 < nestingDepth1) {
3998
3994
std::swap (T1, T2);
3999
3995
std::swap (OrigT1, OrigT2);
@@ -4003,9 +3999,6 @@ GenericSignatureBuilder::addSameTypeRequirementBetweenArchetypes(
4003
3999
auto equivClass = T1->getOrCreateEquivalenceClass (*this );
4004
4000
equivClass->modified (*this );
4005
4001
4006
- // Record the same-type constraint.
4007
- equivClass->recordSameTypeConstraint (*this , OrigT1, OrigT2, Source);
4008
-
4009
4002
auto equivClass1Members = equivClass->members ;
4010
4003
auto equivClass2Members = T2->getEquivalenceClassMembers ();
4011
4004
for (auto equiv : equivClass2Members)
0 commit comments