@@ -5320,7 +5320,7 @@ void swift::diagnoseConformanceFailure(Type T,
5320
5320
// If we're checking conformance of an existential type to a protocol,
5321
5321
// do a little bit of extra work to produce a better diagnostic.
5322
5322
if (T->isExistentialType () &&
5323
- TypeChecker::containsProtocol (T, Proto)) {
5323
+ TypeChecker::containsProtocol (T, Proto). second ) {
5324
5324
5325
5325
if (!T->isObjCExistentialType ()) {
5326
5326
Type constraintType = T;
@@ -5453,7 +5453,7 @@ void swift::diagnoseConformanceFailure(Type T,
5453
5453
T, Proto->getDeclaredInterfaceType ());
5454
5454
}
5455
5455
5456
- ProtocolConformanceRef
5456
+ std::pair< ProtocolConformanceRef, bool >
5457
5457
TypeChecker::containsProtocol (Type T, ProtocolDecl *Proto,
5458
5458
bool allowMissing) {
5459
5459
// Existential types don't need to conform, i.e., they only need to
@@ -5467,7 +5467,8 @@ TypeChecker::containsProtocol(Type T, ProtocolDecl *Proto,
5467
5467
if (constraint->isEqual (Proto->getDeclaredInterfaceType ()) &&
5468
5468
Proto->requiresSelfConformanceWitnessTable ()) {
5469
5469
auto &ctx = T->getASTContext ();
5470
- return ProtocolConformanceRef (ctx.getSelfConformance (Proto));
5470
+ return std::make_pair (
5471
+ ProtocolConformanceRef (ctx.getSelfConformance (Proto)), true );
5471
5472
}
5472
5473
5473
5474
auto layout = T->getExistentialLayout ();
@@ -5482,7 +5483,7 @@ TypeChecker::containsProtocol(Type T, ProtocolDecl *Proto,
5482
5483
auto result =lookupConformance (superclass, Proto,
5483
5484
/* allowMissing=*/ false );
5484
5485
if (result) {
5485
- return result;
5486
+ return std::make_pair ( result, true ) ;
5486
5487
}
5487
5488
}
5488
5489
@@ -5491,19 +5492,21 @@ TypeChecker::containsProtocol(Type T, ProtocolDecl *Proto,
5491
5492
// If we found the protocol we're looking for, return an abstract
5492
5493
// conformance to it.
5493
5494
if (PD == Proto)
5494
- return ProtocolConformanceRef (Proto );
5495
+ return std::make_pair ( ProtocolConformanceRef (), true );
5495
5496
5496
5497
// Now check refined protocols.
5497
5498
if (PD->inheritsFrom (Proto))
5498
- return ProtocolConformanceRef (Proto );
5499
+ return std::make_pair ( ProtocolConformanceRef (), true );
5499
5500
}
5500
5501
5501
- return allowMissing ? ProtocolConformanceRef::forMissingOrInvalid (T, Proto)
5502
- : ProtocolConformanceRef::forInvalid ();
5502
+ auto conf = allowMissing ? ProtocolConformanceRef::forMissingOrInvalid (T, Proto)
5503
+ : ProtocolConformanceRef::forInvalid ();
5504
+ return std::make_pair (conf, !!conf);
5503
5505
}
5504
5506
5505
5507
// For non-existential types, this is equivalent to checking conformance.
5506
- return lookupConformance (T, Proto, allowMissing);
5508
+ auto conf = lookupConformance (T, Proto, allowMissing);
5509
+ return std::make_pair (conf, !!conf);
5507
5510
}
5508
5511
5509
5512
bool TypeChecker::conformsToKnownProtocol (
0 commit comments