@@ -1570,8 +1570,22 @@ bool ProtocolConformance::isCanonical() const {
1570
1570
1571
1571
switch (getKind ()) {
1572
1572
case ProtocolConformanceKind::Self:
1573
- case ProtocolConformanceKind::Normal:
1573
+ case ProtocolConformanceKind::Normal: {
1574
+ return true ;
1575
+ }
1574
1576
case ProtocolConformanceKind::Builtin: {
1577
+ // Check that the generic signature of the conformance is canonical.
1578
+ auto builtinConformance = cast<BuiltinProtocolConformance>(this );
1579
+ if (builtinConformance->getGenericSignature ()
1580
+ && !builtinConformance->getGenericSignature ()->isCanonical ()) {
1581
+ return false ;
1582
+ }
1583
+ // Check that the satisfied conditional requirements are canonical.
1584
+ for (auto &requirement : builtinConformance->getConditionalRequirements ()) {
1585
+ if (!requirement.isCanonical ()) {
1586
+ return false ;
1587
+ }
1588
+ }
1575
1589
return true ;
1576
1590
}
1577
1591
case ProtocolConformanceKind::Inherited: {
@@ -1600,11 +1614,25 @@ ProtocolConformance *ProtocolConformance::getCanonicalConformance() {
1600
1614
1601
1615
switch (getKind ()) {
1602
1616
case ProtocolConformanceKind::Self:
1603
- case ProtocolConformanceKind::Normal:
1604
- case ProtocolConformanceKind::Builtin: {
1617
+ case ProtocolConformanceKind::Normal: {
1605
1618
// Root conformances are always canonical by construction.
1606
1619
return this ;
1607
1620
}
1621
+ case ProtocolConformanceKind::Builtin: {
1622
+ // Canonicalize the subject type of the builtin conformance.
1623
+ auto &Ctx = getType ()->getASTContext ();
1624
+ auto builtinConformance = cast<BuiltinProtocolConformance>(this );
1625
+ SmallVector<Requirement, 4 > canonicalRequirements;
1626
+ for (auto &reqt : builtinConformance->getConditionalRequirements ()) {
1627
+ canonicalRequirements.push_back (reqt.getCanonical ());
1628
+ }
1629
+ return Ctx.getBuiltinConformance (
1630
+ builtinConformance->getType ()->getCanonicalType (),
1631
+ builtinConformance->getProtocol (),
1632
+ builtinConformance->getGenericSignature ().getCanonicalSignature (),
1633
+ canonicalRequirements,
1634
+ builtinConformance->getBuiltinConformanceKind ());
1635
+ }
1608
1636
1609
1637
case ProtocolConformanceKind::Inherited: {
1610
1638
auto &Ctx = getType ()->getASTContext ();
0 commit comments