@@ -1608,8 +1608,22 @@ bool ProtocolConformance::isCanonical() const {
1608
1608
1609
1609
switch (getKind ()) {
1610
1610
case ProtocolConformanceKind::Self:
1611
- case ProtocolConformanceKind::Normal:
1611
+ case ProtocolConformanceKind::Normal: {
1612
+ return true ;
1613
+ }
1612
1614
case ProtocolConformanceKind::Builtin: {
1615
+ // Check that the generic signature of the conformance is canonical.
1616
+ auto builtinConformance = cast<BuiltinProtocolConformance>(this );
1617
+ if (builtinConformance->getGenericSignature ()
1618
+ && !builtinConformance->getGenericSignature ()->isCanonical ()) {
1619
+ return false ;
1620
+ }
1621
+ // Check that the satisfied conditional requirements are canonical.
1622
+ for (auto &requirement : builtinConformance->getConditionalRequirements ()) {
1623
+ if (!requirement.isCanonical ()) {
1624
+ return false ;
1625
+ }
1626
+ }
1613
1627
return true ;
1614
1628
}
1615
1629
case ProtocolConformanceKind::Inherited: {
@@ -1638,11 +1652,25 @@ ProtocolConformance *ProtocolConformance::getCanonicalConformance() {
1638
1652
1639
1653
switch (getKind ()) {
1640
1654
case ProtocolConformanceKind::Self:
1641
- case ProtocolConformanceKind::Normal:
1642
- case ProtocolConformanceKind::Builtin: {
1655
+ case ProtocolConformanceKind::Normal: {
1643
1656
// Root conformances are always canonical by construction.
1644
1657
return this ;
1645
1658
}
1659
+ case ProtocolConformanceKind::Builtin: {
1660
+ // Canonicalize the subject type of the builtin conformance.
1661
+ auto &Ctx = getType ()->getASTContext ();
1662
+ auto builtinConformance = cast<BuiltinProtocolConformance>(this );
1663
+ SmallVector<Requirement, 4 > canonicalRequirements;
1664
+ for (auto &reqt : builtinConformance->getConditionalRequirements ()) {
1665
+ canonicalRequirements.push_back (reqt.getCanonical ());
1666
+ }
1667
+ return Ctx.getBuiltinConformance (
1668
+ builtinConformance->getType ()->getCanonicalType (),
1669
+ builtinConformance->getProtocol (),
1670
+ builtinConformance->getGenericSignature ().getCanonicalSignature (),
1671
+ canonicalRequirements,
1672
+ builtinConformance->getBuiltinConformanceKind ());
1673
+ }
1646
1674
1647
1675
case ProtocolConformanceKind::Inherited: {
1648
1676
auto &Ctx = getType ()->getASTContext ();
0 commit comments