@@ -580,8 +580,6 @@ struct GenericSignatureBuilder::ResolvedType {
580
580
}
581
581
582
582
static ResolvedType forPotentialArchetype (PotentialArchetype *pa) {
583
- assert (!(pa->getParent () && pa->getTypeAliasDecl ()) &&
584
- " typealias is only considered resolved when new" );
585
583
return ResolvedType (pa);
586
584
}
587
585
@@ -899,7 +897,14 @@ static void concretizeNestedTypeFromConcreteParent(
899
897
witnessType = DependentMemberType::get (concreteParent, assocType);
900
898
}
901
899
902
- builder.addSameTypeRequirement (nestedPA, witnessType, source);
900
+ builder.addSameTypeRequirement (nestedPA, witnessType, source,
901
+ [&](Type type1, Type type2) {
902
+ builder.getASTContext ().Diags .diagnose (
903
+ source->getLoc (),
904
+ diag::requires_same_type_conflict,
905
+ nestedPA->getDependentType (/* FIXME: */ { }, true ),
906
+ type1, type2);
907
+ });
903
908
}
904
909
905
910
auto GenericSignatureBuilder::PotentialArchetype::getNestedType (
@@ -1431,34 +1436,23 @@ auto GenericSignatureBuilder::resolve(UnresolvedType paOrT,
1431
1436
}
1432
1437
}
1433
1438
1434
- pa = pa->getRepresentative ();
1435
- if (!pa ->getParent () || !pa ->getTypeAliasDecl ())
1439
+ auto rep = pa->getRepresentative ();
1440
+ if (!rep ->getParent () || !rep ->getTypeAliasDecl ())
1436
1441
return ResolvedType::forPotentialArchetype (pa);
1437
1442
1438
1443
// We're assuming that an equivalence class with a type alias representative
1439
1444
// doesn't have a "true" (i.e. associated type) potential archetype.
1440
- assert (llvm::all_of (pa ->getEquivalenceClass (),
1445
+ assert (llvm::all_of (rep ->getEquivalenceClass (),
1441
1446
[&](PotentialArchetype *pa) {
1442
1447
return pa->getParent () && pa->getTypeAliasDecl ();
1443
1448
}) &&
1444
1449
" unexpected typealias representative with non-typealias equivalent" );
1445
1450
1446
- // The right-hand side of the typealias could itself be an archetype
1447
- // (e.g. protocol P { associatedtype A; typealias B = A }), so we need to
1448
- // resolve that. However, the archetype should always be resolved far enough
1449
- // upon creation to not be another type alias (verified by the ResolvedType
1450
- // constructors below), and hence this function doesn't need to be recursive.
1451
- auto concrete = pa->getConcreteType ();
1452
- auto rhsPA = resolveArchetype (concrete);
1453
- if (!rhsPA) {
1454
- // FIXME: same as hackTypeFromGenericTypeAlias
1455
- if (pa->getTypeAliasDecl ()->getGenericParams ())
1456
- return ResolvedType::forConcreteTypeFromGenericTypeAlias (concrete);
1451
+ // Recursively resolve the concrete type.
1452
+ if (auto concrete = pa->getConcreteType ())
1453
+ return resolve (concrete);
1457
1454
1458
- return ResolvedType::forConcreteType (concrete);
1459
- }
1460
-
1461
- return ResolvedType::forPotentialArchetype (rhsPA);
1455
+ return ResolvedType::forPotentialArchetype (pa);
1462
1456
}
1463
1457
1464
1458
void GenericSignatureBuilder::addGenericParameter (GenericTypeParamDecl *GenericParam) {
@@ -1853,7 +1847,13 @@ bool GenericSignatureBuilder::addSameTypeRequirementBetweenArchetypes(
1853
1847
for (auto T2Nested : equivT2->NestedTypes ) {
1854
1848
auto T1Nested = T1->getNestedType (T2Nested.first , *this );
1855
1849
if (addSameTypeRequirement (T1Nested, T2Nested.second .front (),
1856
- sameNestedTypeSource))
1850
+ sameNestedTypeSource,
1851
+ [&](Type type1, Type type2) {
1852
+ Diags.diagnose (Source->getLoc (),
1853
+ diag::requires_same_type_conflict,
1854
+ T1Nested->getDependentType (/* FIXME: */ { }, true ),
1855
+ type1, type2);
1856
+ }))
1857
1857
return true ;
1858
1858
}
1859
1859
}
@@ -2029,8 +2029,10 @@ bool GenericSignatureBuilder::addSameTypeRequirement(
2029
2029
bool GenericSignatureBuilder::addSameTypeRequirement (ResolvedType paOrT1,
2030
2030
ResolvedType paOrT2,
2031
2031
const RequirementSource *source) {
2032
- return addSameTypeRequirement (paOrT1, paOrT2, source, [&](Type, Type) {
2033
- llvm_unreachable (" unexpected concrete type mismatch" );
2032
+ return addSameTypeRequirement (paOrT1, paOrT2, source,
2033
+ [&](Type type1, Type type2) {
2034
+ Diags.diagnose (source->getLoc (), diag::requires_same_concrete_type,
2035
+ type1, type2);
2034
2036
});
2035
2037
}
2036
2038
0 commit comments