@@ -421,6 +421,20 @@ PotentialArchetype *RequirementSource::getRootPotentialArchetype() const {
421
421
return storage.rootArchetype ;
422
422
}
423
423
424
+ Type RequirementSource::getStoredType () const {
425
+ switch (storageKind) {
426
+ case StorageKind::RootArchetype:
427
+ case StorageKind::ProtocolConformance:
428
+ case StorageKind::AssociatedTypeDecl:
429
+ return Type ();
430
+
431
+ case StorageKind::StoredType:
432
+ return storage.type ;
433
+ }
434
+
435
+ llvm_unreachable (" Unhandled StorageKind in switch." );
436
+ }
437
+
424
438
ProtocolDecl *RequirementSource::getProtocolDecl () const {
425
439
switch (storageKind) {
426
440
case StorageKind::RootArchetype:
@@ -1845,10 +1859,8 @@ bool GenericSignatureBuilder::addConformanceRequirement(PotentialArchetype *PAT,
1845
1859
1846
1860
auto innerSource =
1847
1861
FloatingRequirementSource::viaProtocolRequirement (Source, Proto);
1848
- for (auto rawReq : reqSig->getRequirements ()) {
1849
- auto req = rawReq.subst (protocolSubMap);
1850
- assert (req && " substituting Self in requirement shouldn't fail" );
1851
- if (addRequirement (*req, innerSource, Visited))
1862
+ for (auto req : reqSig->getRequirements ()) {
1863
+ if (addRequirement (req, innerSource, &protocolSubMap, Visited))
1852
1864
return true ;
1853
1865
}
1854
1866
@@ -2423,6 +2435,7 @@ bool GenericSignatureBuilder::addRequirement(const RequirementRepr *Req,
2423
2435
return t;
2424
2436
};
2425
2437
2438
+
2426
2439
switch (Req->getKind ()) {
2427
2440
case RequirementReprKind::LayoutConstraint: {
2428
2441
// FIXME: Need to do something here.
@@ -2454,7 +2467,7 @@ bool GenericSignatureBuilder::addRequirement(const RequirementRepr *Req,
2454
2467
2455
2468
// Check whether this is a supertype requirement.
2456
2469
if (Req->getConstraint ()->getClassOrBoundGenericClass ()) {
2457
- return addSuperclassRequirement (PA, Req->getConstraint (),
2470
+ return addSuperclassRequirement (PA, subst ( Req->getConstraint () ),
2458
2471
source.getSource (PA, Req->getSubject ()));
2459
2472
}
2460
2473
@@ -2494,18 +2507,29 @@ bool GenericSignatureBuilder::addRequirement(const RequirementRepr *Req,
2494
2507
}
2495
2508
2496
2509
bool GenericSignatureBuilder::addRequirement (const Requirement &req,
2497
- FloatingRequirementSource source) {
2498
- llvm::SmallPtrSet<ProtocolDecl *, 8 > Visited;
2499
- return addRequirement (req, source, Visited);
2510
+ FloatingRequirementSource source,
2511
+ const SubstitutionMap *subMap) {
2512
+ llvm::SmallPtrSet<ProtocolDecl *, 8 > visited;
2513
+ return addRequirement (req, source, subMap, visited);
2500
2514
}
2501
2515
2502
2516
bool GenericSignatureBuilder::addRequirement (
2503
- const Requirement &req, FloatingRequirementSource source,
2504
- llvm::SmallPtrSetImpl<ProtocolDecl *> &Visited) {
2517
+ const Requirement &req,
2518
+ FloatingRequirementSource source,
2519
+ const SubstitutionMap *subMap,
2520
+ llvm::SmallPtrSetImpl<ProtocolDecl *> &Visited) {
2521
+ auto subst = [&](Type t) {
2522
+ if (subMap)
2523
+ return t.subst (*subMap);
2524
+
2525
+ return t;
2526
+ };
2527
+
2528
+
2505
2529
switch (req.getKind ()) {
2506
2530
case RequirementKind::Superclass: {
2507
2531
// FIXME: Diagnose this.
2508
- PotentialArchetype *pa = resolveArchetype (req.getFirstType ());
2532
+ PotentialArchetype *pa = resolveArchetype (subst ( req.getFirstType () ));
2509
2533
if (!pa) return false ;
2510
2534
2511
2535
assert (req.getSecondType ()->getClassOrBoundGenericClass ());
@@ -2515,7 +2539,7 @@ bool GenericSignatureBuilder::addRequirement(
2515
2539
2516
2540
case RequirementKind::Layout: {
2517
2541
// FIXME: Diagnose this.
2518
- PotentialArchetype *pa = resolveArchetype (req.getFirstType ());
2542
+ PotentialArchetype *pa = resolveArchetype (subst ( req.getFirstType () ));
2519
2543
if (!pa) return false ;
2520
2544
2521
2545
return addLayoutRequirement (pa, req.getLayoutConstraint (),
@@ -2524,7 +2548,7 @@ bool GenericSignatureBuilder::addRequirement(
2524
2548
2525
2549
case RequirementKind::Conformance: {
2526
2550
// FIXME: Diagnose this.
2527
- PotentialArchetype *pa = resolveArchetype (req.getFirstType ());
2551
+ PotentialArchetype *pa = resolveArchetype (subst ( req.getFirstType () ));
2528
2552
if (!pa) return false ;
2529
2553
2530
2554
SmallVector<ProtocolDecl *, 4 > conformsTo;
@@ -2533,8 +2557,9 @@ bool GenericSignatureBuilder::addRequirement(
2533
2557
// Add each of the protocols.
2534
2558
for (auto proto : conformsTo) {
2535
2559
if (Visited.count (proto)) {
2536
- markPotentialArchetypeRecursive (pa, proto,
2537
- source.getSource (pa, req.getFirstType ()));
2560
+ markPotentialArchetypeRecursive (
2561
+ pa, proto,
2562
+ source.getSource (pa, req.getFirstType ()));
2538
2563
continue ;
2539
2564
}
2540
2565
if (addConformanceRequirement (pa, proto,
@@ -2548,7 +2573,7 @@ bool GenericSignatureBuilder::addRequirement(
2548
2573
2549
2574
case RequirementKind::SameType:
2550
2575
return addSameTypeRequirement (
2551
- req.getFirstType (), req.getSecondType (), source,
2576
+ subst ( req.getFirstType ()), subst ( req.getSecondType () ), source,
2552
2577
[&](Type type1, Type type2) {
2553
2578
if (source.getLoc ().isValid ())
2554
2579
Diags.diagnose (source.getLoc (), diag::requires_same_concrete_type,
0 commit comments