@@ -959,6 +959,15 @@ bool EquivalenceClass::isConformanceSatisfiedBySuperclass(
959
959
return false ;
960
960
}
961
961
962
+ bool GenericSignatureBuilder::recordUnresolvedRequirement (
963
+ RequirementKind kind,
964
+ UnresolvedType lhs,
965
+ RequirementRHS rhs,
966
+ FloatingRequirementSource source) {
967
+ // FIXME: Drop the requirement for now. Nothing depends on this.
968
+ return false ;
969
+ }
970
+
962
971
const RequirementSource *GenericSignatureBuilder::resolveSuperConformance (
963
972
GenericSignatureBuilder::PotentialArchetype *pa,
964
973
ProtocolDecl *proto) {
@@ -1613,9 +1622,9 @@ PotentialArchetype *PotentialArchetype::updateNestedTypeForConformance(
1613
1622
type = type.subst (subMap, SubstFlags::UseErrorType);
1614
1623
1615
1624
builder.addSameTypeRequirement (
1616
- ResolvedType::forNewTypeAlias (resultPA),
1617
- builder. resolve (type),
1618
- RequirementSource::forNestedTypeNameMatch (resultPA));
1625
+ UnresolvedType (resultPA),
1626
+ UnresolvedType (type),
1627
+ RequirementSource::forNestedTypeNameMatch (resultPA));
1619
1628
}
1620
1629
}
1621
1630
@@ -2019,10 +2028,12 @@ auto GenericSignatureBuilder::resolveArchetype(Type type) -> PotentialArchetype
2019
2028
return nullptr ;
2020
2029
}
2021
2030
2022
- auto GenericSignatureBuilder::resolve (UnresolvedType paOrT)
2023
- -> ResolvedType {
2031
+ auto GenericSignatureBuilder::resolve (UnresolvedType paOrT,
2032
+ FloatingRequirementSource source)
2033
+ -> Optional<ResolvedType> {
2024
2034
auto pa = paOrT.dyn_cast <PotentialArchetype *>();
2025
2035
if (auto type = paOrT.dyn_cast <Type>()) {
2036
+ // FIXME: Limit the resolution of the archetype based on the source.
2026
2037
pa = resolveArchetype (type);
2027
2038
if (!pa) {
2028
2039
return ResolvedType::forConcreteType (type);
@@ -2547,19 +2558,47 @@ bool GenericSignatureBuilder::addSameTypeRequirementBetweenConcrete(
2547
2558
return !matcher.match(type1, type2);
2548
2559
}
2549
2560
2561
+ // / Map an unresolved type to a requirement right-hand-side.
2562
+ static GenericSignatureBuilder::RequirementRHS
2563
+ toRequirementRHS (GenericSignatureBuilder::UnresolvedType unresolved) {
2564
+ if (auto pa = unresolved.dyn_cast <PotentialArchetype *>())
2565
+ return pa;
2566
+
2567
+ return unresolved.dyn_cast <Type>();
2568
+ }
2569
+
2550
2570
bool GenericSignatureBuilder::addSameTypeRequirement (
2551
2571
UnresolvedType paOrT1,
2552
2572
UnresolvedType paOrT2,
2553
2573
FloatingRequirementSource source) {
2554
- return addSameTypeRequirement (resolve (paOrT1), resolve (paOrT2), source);
2574
+ return addSameTypeRequirement (paOrT1, paOrT2, source,
2575
+ [&](Type type1, Type type2) {
2576
+ Diags.diagnose (source.getLoc (), diag::requires_same_concrete_type,
2577
+ type1, type2);
2578
+ });
2555
2579
}
2580
+
2556
2581
bool GenericSignatureBuilder::addSameTypeRequirement (
2557
2582
UnresolvedType paOrT1, UnresolvedType paOrT2,
2558
2583
FloatingRequirementSource source,
2559
2584
llvm::function_ref<void (Type, Type)> diagnoseMismatch) {
2560
- return addSameTypeRequirement (resolve (paOrT1), resolve (paOrT2), source,
2585
+
2586
+ auto resolved1 = resolve (paOrT1, source);
2587
+ if (!resolved1) {
2588
+ return recordUnresolvedRequirement (RequirementKind::SameType, paOrT1,
2589
+ toRequirementRHS (paOrT2), source);
2590
+ }
2591
+
2592
+ auto resolved2 = resolve (paOrT2, source);
2593
+ if (!resolved2) {
2594
+ return recordUnresolvedRequirement (RequirementKind::SameType, paOrT1,
2595
+ toRequirementRHS (paOrT2), source);
2596
+ }
2597
+
2598
+ return addSameTypeRequirement (*resolved1, *resolved2, source,
2561
2599
diagnoseMismatch);
2562
2600
}
2601
+
2563
2602
bool GenericSignatureBuilder::addSameTypeRequirement (ResolvedType paOrT1,
2564
2603
ResolvedType paOrT2,
2565
2604
FloatingRequirementSource source) {
0 commit comments