@@ -5374,22 +5374,18 @@ void TypeChecker::inferDefaultWitnesses(ProtocolDecl *proto) {
5374
5374
DefaultWitnessChecker checker (Context, proto);
5375
5375
5376
5376
// Find the default for the given associated type.
5377
- auto findAssociatedTypeDefault =
5378
- [&](AssociatedTypeDecl *assocType,
5379
- AssociatedTypeDecl **defaultedAssocTypeOut = nullptr ) -> Type {
5377
+ auto findAssociatedTypeDefault = [](AssociatedTypeDecl *assocType)
5378
+ -> std::pair<Type, AssociatedTypeDecl *> {
5380
5379
auto defaultedAssocType =
5381
5380
AssociatedTypeInference::findDefaultedAssociatedType (assocType);
5382
5381
if (!defaultedAssocType)
5383
- return nullptr ;
5382
+ return { Type (), nullptr } ;
5384
5383
5385
5384
Type defaultType = defaultedAssocType->getDefaultDefinitionType ();
5386
5385
if (!defaultType)
5387
- return nullptr ;
5388
-
5389
- if (defaultedAssocTypeOut)
5390
- *defaultedAssocTypeOut = defaultedAssocType;
5386
+ return {Type (), nullptr };
5391
5387
5392
- return defaultType;
5388
+ return { defaultType, defaultedAssocType} ;
5393
5389
};
5394
5390
5395
5391
for (auto *requirement : proto->getMembers ()) {
@@ -5402,7 +5398,7 @@ void TypeChecker::inferDefaultWitnesses(ProtocolDecl *proto) {
5402
5398
5403
5399
if (auto assocType = dyn_cast<AssociatedTypeDecl>(valueDecl)) {
5404
5400
if (assocType->getOverriddenDecls ().empty ()) {
5405
- if (Type defaultType = findAssociatedTypeDefault (assocType))
5401
+ if (Type defaultType = findAssociatedTypeDefault (assocType). first )
5406
5402
proto->setDefaultTypeWitness (assocType, defaultType);
5407
5403
}
5408
5404
@@ -5457,9 +5453,10 @@ void TypeChecker::inferDefaultWitnesses(ProtocolDecl *proto) {
5457
5453
}
5458
5454
5459
5455
// Dig out the default associated type definition.
5460
- AssociatedTypeDecl *defaultedAssocType = nullptr ;
5461
- Type defaultAssocType = findAssociatedTypeDefault (assocType,
5462
- &defaultedAssocType);
5456
+ AssociatedTypeDecl *defaultedAssocDecl = nullptr ;
5457
+ Type defaultAssocType;
5458
+ std::tie (defaultAssocType, defaultedAssocDecl) =
5459
+ findAssociatedTypeDefault (assocType);
5463
5460
if (!defaultAssocType)
5464
5461
continue ;
5465
5462
@@ -5472,13 +5469,14 @@ void TypeChecker::inferDefaultWitnesses(ProtocolDecl *proto) {
5472
5469
if (conformance.isInvalid ()) {
5473
5470
// Diagnose the lack of a conformance. This is potentially an ABI
5474
5471
// incompatibility.
5475
- diagnose (proto, diag::assoc_type_default_conformance_failed,
5476
- defaultAssocType, assocType->getFullName (), req.getFirstType (),
5477
- req.getSecondType ());
5478
- diagnose (defaultedAssocType, diag::assoc_type_default_here,
5479
- assocType->getFullName (), defaultAssocType)
5480
- .highlight (
5481
- defaultedAssocType->getDefaultDefinitionTypeRepr ()->getSourceRange ());
5472
+ proto->diagnose (diag::assoc_type_default_conformance_failed,
5473
+ defaultAssocType, assocType->getFullName (),
5474
+ req.getFirstType (), req.getSecondType ());
5475
+ defaultedAssocDecl
5476
+ ->diagnose (diag::assoc_type_default_here, assocType->getFullName (),
5477
+ defaultAssocType)
5478
+ .highlight (defaultedAssocDecl->getDefaultDefinitionTypeRepr ()
5479
+ ->getSourceRange ());
5482
5480
5483
5481
continue ;
5484
5482
}
0 commit comments