@@ -2156,6 +2156,13 @@ auto AssociatedTypeInference::solve(ConformanceChecker &checker)
2156
2156
return None;
2157
2157
}
2158
2158
2159
+ void TypeWitnessSystem::EquivalenceClass::setResolvedType (Type ty) {
2160
+ assert (ty && " cannot resolve to a null type" );
2161
+ assert (!isAmbiguous () && " must not set resolved type when ambiguous" );
2162
+
2163
+ ResolvedTyAndIsAmbiguous.setPointer (ty);
2164
+ }
2165
+
2159
2166
TypeWitnessSystem::TypeWitnessSystem (
2160
2167
ArrayRef<AssociatedTypeDecl *> assocTypes) {
2161
2168
for (auto *assocType : assocTypes) {
@@ -2177,7 +2184,7 @@ Type TypeWitnessSystem::getResolvedTypeWitness(Identifier name) const {
2177
2184
assert (this ->TypeWitnesses .count (name));
2178
2185
2179
2186
if (auto *equivClass = this ->TypeWitnesses .lookup (name).EquivClass ) {
2180
- return equivClass->ResolvedTy ;
2187
+ return equivClass->getResolvedType () ;
2181
2188
}
2182
2189
2183
2190
return Type ();
@@ -2219,15 +2226,16 @@ void TypeWitnessSystem::addTypeWitness(Identifier name, Type type) {
2219
2226
//
2220
2227
// If we already have a resolved type, keep going only if the new one is
2221
2228
// better.
2222
- if (tyWitness.EquivClass && tyWitness.EquivClass ->ResolvedTy ) {
2223
- if (!isBetterResolvedType (type, tyWitness.EquivClass ->ResolvedTy )) {
2229
+ if (tyWitness.EquivClass && tyWitness.EquivClass ->getResolvedType () ) {
2230
+ if (!isBetterResolvedType (type, tyWitness.EquivClass ->getResolvedType () )) {
2224
2231
return ;
2225
2232
}
2226
2233
}
2227
2234
2228
2235
// If we can find an existing equivalence class for this type, use it.
2229
2236
for (auto *const equivClass : this ->EquivalenceClasses ) {
2230
- if (equivClass->ResolvedTy && equivClass->ResolvedTy ->isEqual (type)) {
2237
+ if (equivClass->getResolvedType () &&
2238
+ equivClass->getResolvedType ()->isEqual (type)) {
2231
2239
if (tyWitness.EquivClass ) {
2232
2240
mergeEquivalenceClasses (equivClass, tyWitness.EquivClass );
2233
2241
} else {
@@ -2239,9 +2247,9 @@ void TypeWitnessSystem::addTypeWitness(Identifier name, Type type) {
2239
2247
}
2240
2248
2241
2249
if (tyWitness.EquivClass ) {
2242
- tyWitness.EquivClass ->ResolvedTy = type;
2250
+ tyWitness.EquivClass ->setResolvedType ( type) ;
2243
2251
} else {
2244
- auto *equivClass = new EquivalenceClass{ type} ;
2252
+ auto *equivClass = new EquivalenceClass ( type) ;
2245
2253
this ->EquivalenceClasses .insert (equivClass);
2246
2254
2247
2255
tyWitness.EquivClass = equivClass;
@@ -2308,8 +2316,10 @@ void TypeWitnessSystem::dump(
2308
2316
2309
2317
const auto *eqClass = this ->TypeWitnesses .lookup (name).EquivClass ;
2310
2318
if (eqClass) {
2311
- if (eqClass->ResolvedTy ) {
2312
- out << eqClass->ResolvedTy ;
2319
+ if (eqClass->getResolvedType ()) {
2320
+ out << eqClass->getResolvedType ();
2321
+ } else if (eqClass->isAmbiguous ()) {
2322
+ out << " (ambiguous)" ;
2313
2323
} else {
2314
2324
out << " (unresolved)" ;
2315
2325
}
@@ -2349,7 +2359,7 @@ void TypeWitnessSystem::addEquivalence(Identifier name1, Identifier name2) {
2349
2359
tyWitness1.EquivClass = tyWitness2.EquivClass ;
2350
2360
} else {
2351
2361
// Neither has an associated equivalence class.
2352
- auto *equivClass = new EquivalenceClass{ nullptr } ;
2362
+ auto *equivClass = new EquivalenceClass ( nullptr ) ;
2353
2363
this ->EquivalenceClasses .insert (equivClass);
2354
2364
2355
2365
tyWitness1.EquivClass = equivClass;
@@ -2365,13 +2375,13 @@ void TypeWitnessSystem::mergeEquivalenceClasses(
2365
2375
}
2366
2376
2367
2377
// Merge the second resolved type into the first.
2368
- if (equivClass1->ResolvedTy && equivClass2->ResolvedTy ) {
2369
- if (isBetterResolvedType (equivClass2->ResolvedTy ,
2370
- equivClass1->ResolvedTy )) {
2371
- equivClass1->ResolvedTy = equivClass2->ResolvedTy ;
2378
+ if (equivClass1->getResolvedType () && equivClass2->getResolvedType () ) {
2379
+ if (isBetterResolvedType (equivClass2->getResolvedType () ,
2380
+ equivClass1->getResolvedType () )) {
2381
+ equivClass1->setResolvedType ( equivClass2->getResolvedType ()) ;
2372
2382
}
2373
- } else if (equivClass2->ResolvedTy ) {
2374
- equivClass1->ResolvedTy = equivClass2->ResolvedTy ;
2383
+ } else if (equivClass2->getResolvedType () ) {
2384
+ equivClass1->setResolvedType ( equivClass2->getResolvedType ()) ;
2375
2385
}
2376
2386
2377
2387
// Migrate members of the second equivalence class to the first.
0 commit comments