@@ -1019,12 +1019,8 @@ LazyResolver *GenericSignatureBuilder::getLazyResolver() const {
1019
1019
return Context.getLazyResolver ();
1020
1020
}
1021
1021
1022
- auto GenericSignatureBuilder::resolveArchetype (Type type, PotentialArchetype *basePA)
1023
- -> PotentialArchetype * {
1022
+ auto GenericSignatureBuilder::resolveArchetype (Type type) -> PotentialArchetype * {
1024
1023
if (auto genericParam = type->getAs <GenericTypeParamType>()) {
1025
- if (basePA)
1026
- return basePA;
1027
-
1028
1024
unsigned index = GenericParamKey (genericParam).findIndexIn (
1029
1025
Impl->GenericParams );
1030
1026
if (index < Impl->GenericParams .size ())
@@ -1034,7 +1030,7 @@ auto GenericSignatureBuilder::resolveArchetype(Type type, PotentialArchetype *ba
1034
1030
}
1035
1031
1036
1032
if (auto dependentMember = type->getAs <DependentMemberType>()) {
1037
- auto base = resolveArchetype (dependentMember->getBase (), basePA );
1033
+ auto base = resolveArchetype (dependentMember->getBase ());
1038
1034
if (!base)
1039
1035
return nullptr ;
1040
1036
@@ -1112,9 +1108,15 @@ bool GenericSignatureBuilder::addConformanceRequirement(PotentialArchetype *PAT,
1112
1108
if (Proto->isRequirementSignatureComputed ()) {
1113
1109
auto reqSig = Proto->getRequirementSignature ();
1114
1110
1115
- for (auto req : reqSig->getRequirements ()) {
1111
+ auto concreteSelf = T->getDependentType ({}, /* allowUnresolved=*/ true );
1112
+ auto subMap = SubstitutionMap::getProtocolSubstitutions (
1113
+ Proto, concreteSelf, ProtocolConformanceRef (Proto));
1114
+
1115
+ for (auto rawReq : reqSig->getRequirements ()) {
1116
+ auto req = rawReq.subst (subMap);
1117
+ assert (req && " substituting Self in requirement shouldn't fail" );
1116
1118
RequirementSource InnerSource (Kind, Source.getLoc ());
1117
- addRequirement (req, InnerSource, T , Visited);
1119
+ addRequirement (* req, InnerSource, Visited);
1118
1120
}
1119
1121
} else {
1120
1122
// Conformances to inherit protocols are explicit in a protocol requirement
@@ -1333,9 +1335,8 @@ bool GenericSignatureBuilder::addSameTypeRequirementBetweenArchetypes(
1333
1335
Type concrete2 = T2->getConcreteType ();
1334
1336
1335
1337
if (concrete1 && concrete2) {
1336
- bool mismatch =
1337
- addSameTypeRequirement (concrete1, concrete2, Source, nullptr ,
1338
- [&](Type type1, Type type2) {
1338
+ bool mismatch = addSameTypeRequirement (
1339
+ concrete1, concrete2, Source, [&](Type type1, Type type2) {
1339
1340
Diags.diagnose (Source.getLoc (),
1340
1341
diag::requires_same_type_conflict,
1341
1342
T1->getDependentType (/* FIXME: */ { }, true ), type1,
@@ -1411,9 +1412,8 @@ bool GenericSignatureBuilder::addSameTypeRequirementToConcrete(
1411
1412
// If we've already been bound to a type, we're either done, or we have a
1412
1413
// problem.
1413
1414
if (auto oldConcrete = T->getConcreteType ()) {
1414
- bool mismatch =
1415
- addSameTypeRequirement (oldConcrete, Concrete, Source, nullptr ,
1416
- [&](Type type1, Type type2) {
1415
+ bool mismatch = addSameTypeRequirement (
1416
+ oldConcrete, Concrete, Source, [&](Type type1, Type type2) {
1417
1417
Diags.diagnose (Source.getLoc (),
1418
1418
diag::requires_same_type_conflict,
1419
1419
T->getDependentType (/* FIXME: */ { }, true ), type1,
@@ -1486,30 +1486,25 @@ bool GenericSignatureBuilder::addSameTypeRequirementToConcrete(
1486
1486
}
1487
1487
1488
1488
bool GenericSignatureBuilder::addSameTypeRequirement (
1489
- Type type1, Type type2,
1490
- RequirementSource source,
1491
- PotentialArchetype *basePA,
1492
- llvm::function_ref<void (Type, Type)> diagnoseMismatch) {
1489
+ Type type1, Type type2, RequirementSource source,
1490
+ llvm::function_ref<void (Type, Type)> diagnoseMismatch) {
1493
1491
// Local class to handle matching the two sides of the same-type constraint.
1494
1492
class ReqTypeMatcher : public TypeMatcher <ReqTypeMatcher> {
1495
1493
GenericSignatureBuilder &builder;
1496
1494
RequirementSource source;
1497
- PotentialArchetype *basePA;
1498
1495
llvm::function_ref<void (Type, Type)> diagnoseMismatch;
1499
1496
1500
1497
public:
1501
- ReqTypeMatcher (GenericSignatureBuilder &builder,
1502
- RequirementSource source,
1503
- PotentialArchetype *basePA,
1498
+ ReqTypeMatcher (GenericSignatureBuilder &builder, RequirementSource source,
1504
1499
llvm::function_ref<void (Type, Type)> diagnoseMismatch)
1505
- : builder(builder), source(source), basePA(basePA),
1506
- diagnoseMismatch (diagnoseMismatch) { }
1500
+ : builder(builder), source(source), diagnoseMismatch(diagnoseMismatch) {
1501
+ }
1507
1502
1508
1503
bool mismatch (TypeBase *firstType, TypeBase *secondType,
1509
1504
Type sugaredFirstType) {
1510
1505
// Find the potential archetypes.
1511
- PotentialArchetype *pa1 = builder.resolveArchetype (firstType, basePA );
1512
- PotentialArchetype *pa2 = builder.resolveArchetype (secondType, basePA );
1506
+ PotentialArchetype *pa1 = builder.resolveArchetype (firstType);
1507
+ PotentialArchetype *pa2 = builder.resolveArchetype (secondType);
1513
1508
1514
1509
// If both sides of the requirement are type parameters, equate them.
1515
1510
if (pa1 && pa2)
@@ -1527,7 +1522,7 @@ bool GenericSignatureBuilder::addSameTypeRequirement(
1527
1522
diagnoseMismatch (sugaredFirstType, secondType);
1528
1523
return false ;
1529
1524
}
1530
- } matcher(*this , source, basePA, diagnoseMismatch);
1525
+ } matcher (*this , source, diagnoseMismatch);
1531
1526
1532
1527
return !matcher.match (type1, type2);
1533
1528
}
@@ -1697,17 +1692,16 @@ bool GenericSignatureBuilder::addRequirement(const RequirementRepr &Req) {
1697
1692
bool GenericSignatureBuilder::addRequirement (const Requirement &req,
1698
1693
RequirementSource source) {
1699
1694
llvm::SmallPtrSet<ProtocolDecl *, 8 > Visited;
1700
- return addRequirement (req, source, nullptr , Visited);
1695
+ return addRequirement (req, source, Visited);
1701
1696
}
1702
1697
1703
1698
bool GenericSignatureBuilder::addRequirement (
1704
1699
const Requirement &req, RequirementSource source,
1705
- PotentialArchetype *basePA,
1706
1700
llvm::SmallPtrSetImpl<ProtocolDecl *> &Visited) {
1707
1701
switch (req.getKind ()) {
1708
1702
case RequirementKind::Superclass: {
1709
1703
// FIXME: Diagnose this.
1710
- PotentialArchetype *pa = resolveArchetype (req.getFirstType (), basePA );
1704
+ PotentialArchetype *pa = resolveArchetype (req.getFirstType ());
1711
1705
if (!pa) return false ;
1712
1706
1713
1707
assert (req.getSecondType ()->getClassOrBoundGenericClass ());
@@ -1716,15 +1710,15 @@ bool GenericSignatureBuilder::addRequirement(
1716
1710
1717
1711
case RequirementKind::Layout: {
1718
1712
// FIXME: Diagnose this.
1719
- PotentialArchetype *pa = resolveArchetype (req.getFirstType (), basePA );
1713
+ PotentialArchetype *pa = resolveArchetype (req.getFirstType ());
1720
1714
if (!pa) return false ;
1721
1715
1722
1716
return addLayoutRequirement (pa, req.getLayoutConstraint (), source);
1723
1717
}
1724
1718
1725
1719
case RequirementKind::Conformance: {
1726
1720
// FIXME: Diagnose this.
1727
- PotentialArchetype *pa = resolveArchetype (req.getFirstType (), basePA );
1721
+ PotentialArchetype *pa = resolveArchetype (req.getFirstType ());
1728
1722
if (!pa) return false ;
1729
1723
1730
1724
SmallVector<ProtocolDecl *, 4 > conformsTo;
@@ -1744,7 +1738,7 @@ bool GenericSignatureBuilder::addRequirement(
1744
1738
1745
1739
case RequirementKind::SameType:
1746
1740
return addSameTypeRequirement (
1747
- req.getFirstType (), req.getSecondType (), source, basePA,
1741
+ req.getFirstType (), req.getSecondType (), source,
1748
1742
[&](Type type1, Type type2) {
1749
1743
if (source.getLoc ().isValid ())
1750
1744
Diags.diagnose (source.getLoc (),
@@ -1804,25 +1798,21 @@ class GenericSignatureBuilder::InferRequirementsWalker : public TypeWalker {
1804
1798
1805
1799
// Handle the requirements.
1806
1800
RequirementSource source (RequirementSource::Inferred, Loc);
1807
- for (const auto &req : genericSig->getRequirements ()) {
1808
- switch (req.getKind ()) {
1809
- case RequirementKind::SameType: {
1810
- auto firstType = req.getFirstType ().subst (
1811
- getTypeSubstitution,
1812
- Builder.getLookupConformanceFn ());
1813
- if (!firstType)
1814
- break ;
1801
+ for (const auto &rawReq : genericSig->getRequirements ()) {
1802
+ auto req =
1803
+ rawReq.subst (getTypeSubstitution, Builder.getLookupConformanceFn ());
1804
+ if (!req)
1805
+ continue ;
1815
1806
1807
+ switch (req->getKind ()) {
1808
+ case RequirementKind::SameType: {
1809
+ auto firstType = req->getFirstType ();
1816
1810
auto firstPA = Builder.resolveArchetype (firstType);
1817
1811
1818
1812
if (firstPA && isOuterArchetype (firstPA))
1819
1813
return Action::Continue;
1820
1814
1821
- auto secondType = req.getSecondType ().subst (
1822
- getTypeSubstitution,
1823
- Builder.getLookupConformanceFn ());
1824
- if (!secondType)
1825
- break ;
1815
+ auto secondType = req->getSecondType ();
1826
1816
auto secondPA = Builder.resolveArchetype (secondType);
1827
1817
1828
1818
if (firstPA && secondPA) {
@@ -1843,12 +1833,7 @@ class GenericSignatureBuilder::InferRequirementsWalker : public TypeWalker {
1843
1833
case RequirementKind::Superclass:
1844
1834
case RequirementKind::Layout:
1845
1835
case RequirementKind::Conformance: {
1846
- auto subjectType = req.getFirstType ().subst (
1847
- getTypeSubstitution,
1848
- Builder.getLookupConformanceFn ());
1849
- if (!subjectType)
1850
- break ;
1851
-
1836
+ auto subjectType = req->getFirstType ();
1852
1837
auto subjectPA = Builder.resolveArchetype (subjectType);
1853
1838
if (!subjectPA) {
1854
1839
break ;
@@ -1857,19 +1842,19 @@ class GenericSignatureBuilder::InferRequirementsWalker : public TypeWalker {
1857
1842
if (isOuterArchetype (subjectPA))
1858
1843
return Action::Continue;
1859
1844
1860
- if (req. getKind () == RequirementKind::Conformance) {
1861
- auto proto = req. getSecondType ()->castTo <ProtocolType>();
1845
+ if (req-> getKind () == RequirementKind::Conformance) {
1846
+ auto proto = req-> getSecondType ()->castTo <ProtocolType>();
1862
1847
if (Builder.addConformanceRequirement (subjectPA, proto->getDecl (),
1863
1848
source)) {
1864
1849
return Action::Stop;
1865
1850
}
1866
- } else if (req. getKind () == RequirementKind::Layout) {
1867
- if (Builder.addLayoutRequirement (subjectPA, req. getLayoutConstraint (),
1868
- source)) {
1851
+ } else if (req-> getKind () == RequirementKind::Layout) {
1852
+ if (Builder.addLayoutRequirement (
1853
+ subjectPA, req-> getLayoutConstraint (), source)) {
1869
1854
return Action::Stop;
1870
1855
}
1871
1856
} else {
1872
- if (Builder.addSuperclassRequirement (subjectPA, req. getSecondType (),
1857
+ if (Builder.addSuperclassRequirement (subjectPA, req-> getSecondType (),
1873
1858
source)) {
1874
1859
return Action::Stop;
1875
1860
}
0 commit comments