@@ -136,13 +136,19 @@ std::string GenericSignatureBuilder::PotentialArchetype::getDebugName() const {
136
136
// Nested types.
137
137
result += parent->getDebugName ();
138
138
139
- // When building the name for debugging purposes, include the
140
- // protocol into which the associated type was resolved.
139
+ // When building the name for debugging purposes, include the protocol into
140
+ // which the associated type or type alias was resolved.
141
+ ProtocolDecl *proto = nullptr ;
141
142
if (auto assocType = getResolvedAssociatedType ()) {
143
+ proto = assocType->getProtocol ();
144
+ } else if (auto typeAlias = getTypeAliasDecl ()) {
145
+ proto = typeAlias->getParent ()->getAsProtocolOrProtocolExtensionContext ();
146
+ }
147
+
148
+ if (proto) {
142
149
result.push_back (' [' );
143
150
result.push_back (' .' );
144
- result.append (assocType->getProtocol ()->getName ().str ().begin (),
145
- assocType->getProtocol ()->getName ().str ().end ());
151
+ result.append (proto->getName ().str ().begin (), proto->getName ().str ().end ());
146
152
result.push_back (' ]' );
147
153
}
148
154
@@ -908,13 +914,11 @@ Type GenericSignatureBuilder::PotentialArchetype::getDependentType(
908
914
909
915
assert (isGenericParam () && " Not a generic parameter?" );
910
916
911
- unsigned index = getGenericParamKey ().findIndexIn (genericParams);
912
-
913
917
// FIXME: This is a temporary workaround.
914
- if (genericParams.empty ()) {
915
- return getBuilder ()->Impl ->GenericParams [index];
916
- }
918
+ if (genericParams.empty ())
919
+ genericParams = getBuilder ()->Impl ->GenericParams ;
917
920
921
+ unsigned index = getGenericParamKey ().findIndexIn (genericParams);
918
922
return genericParams[index];
919
923
}
920
924
@@ -1007,12 +1011,8 @@ LazyResolver *GenericSignatureBuilder::getLazyResolver() const {
1007
1011
return Context.getLazyResolver ();
1008
1012
}
1009
1013
1010
- auto GenericSignatureBuilder::resolveArchetype (Type type, PotentialArchetype *basePA)
1011
- -> PotentialArchetype * {
1014
+ auto GenericSignatureBuilder::resolveArchetype (Type type) -> PotentialArchetype * {
1012
1015
if (auto genericParam = type->getAs <GenericTypeParamType>()) {
1013
- if (basePA)
1014
- return basePA;
1015
-
1016
1016
unsigned index = GenericParamKey (genericParam).findIndexIn (
1017
1017
Impl->GenericParams );
1018
1018
if (index < Impl->GenericParams .size ())
@@ -1022,7 +1022,7 @@ auto GenericSignatureBuilder::resolveArchetype(Type type, PotentialArchetype *ba
1022
1022
}
1023
1023
1024
1024
if (auto dependentMember = type->getAs <DependentMemberType>()) {
1025
- auto base = resolveArchetype (dependentMember->getBase (), basePA );
1025
+ auto base = resolveArchetype (dependentMember->getBase ());
1026
1026
if (!base)
1027
1027
return nullptr ;
1028
1028
@@ -1100,9 +1100,15 @@ bool GenericSignatureBuilder::addConformanceRequirement(PotentialArchetype *PAT,
1100
1100
if (Proto->isRequirementSignatureComputed ()) {
1101
1101
auto reqSig = Proto->getRequirementSignature ();
1102
1102
1103
- for (auto req : reqSig->getRequirements ()) {
1103
+ auto concreteSelf = T->getDependentType ({}, /* allowUnresolved=*/ true );
1104
+ auto subMap = SubstitutionMap::getProtocolSubstitutions (
1105
+ Proto, concreteSelf, ProtocolConformanceRef (Proto));
1106
+
1107
+ for (auto rawReq : reqSig->getRequirements ()) {
1108
+ auto req = rawReq.subst (subMap);
1109
+ assert (req && " substituting Self in requirement shouldn't fail" );
1104
1110
RequirementSource InnerSource (Kind, Source.getLoc ());
1105
- addRequirement (req, InnerSource, T , Visited);
1111
+ addRequirement (* req, InnerSource, Visited);
1106
1112
}
1107
1113
} else {
1108
1114
// Conformances to inherit protocols are explicit in a protocol requirement
@@ -1321,9 +1327,8 @@ bool GenericSignatureBuilder::addSameTypeRequirementBetweenArchetypes(
1321
1327
Type concrete2 = T2->getConcreteType ();
1322
1328
1323
1329
if (concrete1 && concrete2) {
1324
- bool mismatch =
1325
- addSameTypeRequirement (concrete1, concrete2, Source, nullptr ,
1326
- [&](Type type1, Type type2) {
1330
+ bool mismatch = addSameTypeRequirement (
1331
+ concrete1, concrete2, Source, [&](Type type1, Type type2) {
1327
1332
Diags.diagnose (Source.getLoc (),
1328
1333
diag::requires_same_type_conflict,
1329
1334
T1->getDependentType (/* FIXME: */ { }, true ), type1,
@@ -1399,9 +1404,8 @@ bool GenericSignatureBuilder::addSameTypeRequirementToConcrete(
1399
1404
// If we've already been bound to a type, we're either done, or we have a
1400
1405
// problem.
1401
1406
if (auto oldConcrete = T->getConcreteType ()) {
1402
- bool mismatch =
1403
- addSameTypeRequirement (oldConcrete, Concrete, Source, nullptr ,
1404
- [&](Type type1, Type type2) {
1407
+ bool mismatch = addSameTypeRequirement (
1408
+ oldConcrete, Concrete, Source, [&](Type type1, Type type2) {
1405
1409
Diags.diagnose (Source.getLoc (),
1406
1410
diag::requires_same_type_conflict,
1407
1411
T->getDependentType (/* FIXME: */ { }, true ), type1,
@@ -1474,30 +1478,25 @@ bool GenericSignatureBuilder::addSameTypeRequirementToConcrete(
1474
1478
}
1475
1479
1476
1480
bool GenericSignatureBuilder::addSameTypeRequirement (
1477
- Type type1, Type type2,
1478
- RequirementSource source,
1479
- PotentialArchetype *basePA,
1480
- llvm::function_ref<void (Type, Type)> diagnoseMismatch) {
1481
+ Type type1, Type type2, RequirementSource source,
1482
+ llvm::function_ref<void (Type, Type)> diagnoseMismatch) {
1481
1483
// Local class to handle matching the two sides of the same-type constraint.
1482
1484
class ReqTypeMatcher : public TypeMatcher <ReqTypeMatcher> {
1483
1485
GenericSignatureBuilder &builder;
1484
1486
RequirementSource source;
1485
- PotentialArchetype *basePA;
1486
1487
llvm::function_ref<void (Type, Type)> diagnoseMismatch;
1487
1488
1488
1489
public:
1489
- ReqTypeMatcher (GenericSignatureBuilder &builder,
1490
- RequirementSource source,
1491
- PotentialArchetype *basePA,
1490
+ ReqTypeMatcher (GenericSignatureBuilder &builder, RequirementSource source,
1492
1491
llvm::function_ref<void (Type, Type)> diagnoseMismatch)
1493
- : builder(builder), source(source), basePA(basePA),
1494
- diagnoseMismatch (diagnoseMismatch) { }
1492
+ : builder(builder), source(source), diagnoseMismatch(diagnoseMismatch) {
1493
+ }
1495
1494
1496
1495
bool mismatch (TypeBase *firstType, TypeBase *secondType,
1497
1496
Type sugaredFirstType) {
1498
1497
// Find the potential archetypes.
1499
- PotentialArchetype *pa1 = builder.resolveArchetype (firstType, basePA );
1500
- PotentialArchetype *pa2 = builder.resolveArchetype (secondType, basePA );
1498
+ PotentialArchetype *pa1 = builder.resolveArchetype (firstType);
1499
+ PotentialArchetype *pa2 = builder.resolveArchetype (secondType);
1501
1500
1502
1501
// If both sides of the requirement are type parameters, equate them.
1503
1502
if (pa1 && pa2)
@@ -1515,7 +1514,7 @@ bool GenericSignatureBuilder::addSameTypeRequirement(
1515
1514
diagnoseMismatch (sugaredFirstType, secondType);
1516
1515
return false ;
1517
1516
}
1518
- } matcher(*this , source, basePA, diagnoseMismatch);
1517
+ } matcher (*this , source, diagnoseMismatch);
1519
1518
1520
1519
return !matcher.match (type1, type2);
1521
1520
}
@@ -1685,17 +1684,16 @@ bool GenericSignatureBuilder::addRequirement(const RequirementRepr &Req) {
1685
1684
bool GenericSignatureBuilder::addRequirement (const Requirement &req,
1686
1685
RequirementSource source) {
1687
1686
llvm::SmallPtrSet<ProtocolDecl *, 8 > Visited;
1688
- return addRequirement (req, source, nullptr , Visited);
1687
+ return addRequirement (req, source, Visited);
1689
1688
}
1690
1689
1691
1690
bool GenericSignatureBuilder::addRequirement (
1692
1691
const Requirement &req, RequirementSource source,
1693
- PotentialArchetype *basePA,
1694
1692
llvm::SmallPtrSetImpl<ProtocolDecl *> &Visited) {
1695
1693
switch (req.getKind ()) {
1696
1694
case RequirementKind::Superclass: {
1697
1695
// FIXME: Diagnose this.
1698
- PotentialArchetype *pa = resolveArchetype (req.getFirstType (), basePA );
1696
+ PotentialArchetype *pa = resolveArchetype (req.getFirstType ());
1699
1697
if (!pa) return false ;
1700
1698
1701
1699
assert (req.getSecondType ()->getClassOrBoundGenericClass ());
@@ -1704,15 +1702,15 @@ bool GenericSignatureBuilder::addRequirement(
1704
1702
1705
1703
case RequirementKind::Layout: {
1706
1704
// FIXME: Diagnose this.
1707
- PotentialArchetype *pa = resolveArchetype (req.getFirstType (), basePA );
1705
+ PotentialArchetype *pa = resolveArchetype (req.getFirstType ());
1708
1706
if (!pa) return false ;
1709
1707
1710
1708
return addLayoutRequirement (pa, req.getLayoutConstraint (), source);
1711
1709
}
1712
1710
1713
1711
case RequirementKind::Conformance: {
1714
1712
// FIXME: Diagnose this.
1715
- PotentialArchetype *pa = resolveArchetype (req.getFirstType (), basePA );
1713
+ PotentialArchetype *pa = resolveArchetype (req.getFirstType ());
1716
1714
if (!pa) return false ;
1717
1715
1718
1716
SmallVector<ProtocolDecl *, 4 > conformsTo;
@@ -1732,7 +1730,7 @@ bool GenericSignatureBuilder::addRequirement(
1732
1730
1733
1731
case RequirementKind::SameType:
1734
1732
return addSameTypeRequirement (
1735
- req.getFirstType (), req.getSecondType (), source, basePA,
1733
+ req.getFirstType (), req.getSecondType (), source,
1736
1734
[&](Type type1, Type type2) {
1737
1735
if (source.getLoc ().isValid ())
1738
1736
Diags.diagnose (source.getLoc (),
@@ -1792,25 +1790,21 @@ class GenericSignatureBuilder::InferRequirementsWalker : public TypeWalker {
1792
1790
1793
1791
// Handle the requirements.
1794
1792
RequirementSource source (RequirementSource::Inferred, Loc);
1795
- for (const auto &req : genericSig->getRequirements ()) {
1796
- switch (req.getKind ()) {
1797
- case RequirementKind::SameType: {
1798
- auto firstType = req.getFirstType ().subst (
1799
- getTypeSubstitution,
1800
- Builder.getLookupConformanceFn ());
1801
- if (!firstType)
1802
- break ;
1793
+ for (const auto &rawReq : genericSig->getRequirements ()) {
1794
+ auto req =
1795
+ rawReq.subst (getTypeSubstitution, Builder.getLookupConformanceFn ());
1796
+ if (!req)
1797
+ continue ;
1803
1798
1799
+ switch (req->getKind ()) {
1800
+ case RequirementKind::SameType: {
1801
+ auto firstType = req->getFirstType ();
1804
1802
auto firstPA = Builder.resolveArchetype (firstType);
1805
1803
1806
1804
if (firstPA && isOuterArchetype (firstPA))
1807
1805
return Action::Continue;
1808
1806
1809
- auto secondType = req.getSecondType ().subst (
1810
- getTypeSubstitution,
1811
- Builder.getLookupConformanceFn ());
1812
- if (!secondType)
1813
- break ;
1807
+ auto secondType = req->getSecondType ();
1814
1808
auto secondPA = Builder.resolveArchetype (secondType);
1815
1809
1816
1810
if (firstPA && secondPA) {
@@ -1831,12 +1825,7 @@ class GenericSignatureBuilder::InferRequirementsWalker : public TypeWalker {
1831
1825
case RequirementKind::Superclass:
1832
1826
case RequirementKind::Layout:
1833
1827
case RequirementKind::Conformance: {
1834
- auto subjectType = req.getFirstType ().subst (
1835
- getTypeSubstitution,
1836
- Builder.getLookupConformanceFn ());
1837
- if (!subjectType)
1838
- break ;
1839
-
1828
+ auto subjectType = req->getFirstType ();
1840
1829
auto subjectPA = Builder.resolveArchetype (subjectType);
1841
1830
if (!subjectPA) {
1842
1831
break ;
@@ -1845,22 +1834,29 @@ class GenericSignatureBuilder::InferRequirementsWalker : public TypeWalker {
1845
1834
if (isOuterArchetype (subjectPA))
1846
1835
return Action::Continue;
1847
1836
1848
- if (req.getKind () == RequirementKind::Conformance) {
1849
- auto proto = req.getSecondType ()->castTo <ProtocolType>();
1837
+ switch (req->getKind ()) {
1838
+ case RequirementKind::Conformance: {
1839
+ auto proto = req->getSecondType ()->castTo <ProtocolType>();
1850
1840
if (Builder.addConformanceRequirement (subjectPA, proto->getDecl (),
1851
1841
source)) {
1852
1842
return Action::Stop;
1853
1843
}
1854
- } else if (req.getKind () == RequirementKind::Layout) {
1855
- if (Builder.addLayoutRequirement (subjectPA, req.getLayoutConstraint (),
1856
- source)) {
1844
+ break ;
1845
+ }
1846
+ case RequirementKind::Layout:
1847
+ if (Builder.addLayoutRequirement (
1848
+ subjectPA, req->getLayoutConstraint (), source)) {
1857
1849
return Action::Stop;
1858
1850
}
1859
- } else {
1860
- if (Builder.addSuperclassRequirement (subjectPA, req.getSecondType (),
1851
+ break ;
1852
+ case RequirementKind::Superclass:
1853
+ if (Builder.addSuperclassRequirement (subjectPA, req->getSecondType (),
1861
1854
source)) {
1862
1855
return Action::Stop;
1863
1856
}
1857
+ break ;
1858
+ case RequirementKind::SameType:
1859
+ llvm_unreachable (" covered by outer switch" );
1864
1860
}
1865
1861
break ;
1866
1862
}
0 commit comments