@@ -1884,7 +1884,6 @@ class MultiConformanceChecker {
1884
1884
llvm::SmallVector<ValueDecl*, 16 > UnsatisfiedReqs;
1885
1885
llvm::SmallVector<ConformanceChecker, 4 > AllUsedCheckers;
1886
1886
llvm::SmallVector<NormalProtocolConformance*, 4 > AllConformances;
1887
- llvm::SetVector<ASTContext::MissingWitness> MissingWitnesses;
1888
1887
llvm::SmallPtrSet<ValueDecl *, 8 > CoveredMembers;
1889
1888
1890
1889
// / Check one conformance.
@@ -1976,6 +1975,8 @@ static void diagnoseProtocolStubFixit(
1976
1975
ArrayRef<ASTContext::MissingWitness> missingWitnesses);
1977
1976
1978
1977
void MultiConformanceChecker::checkAllConformances () {
1978
+ llvm::SetVector<ASTContext::MissingWitness> MissingWitnesses;
1979
+
1979
1980
bool anyInvalid = false ;
1980
1981
for (auto *conformance : AllConformances) {
1981
1982
checkIndividualConformance (conformance);
@@ -1995,16 +1996,12 @@ void MultiConformanceChecker::checkAllConformances() {
1995
1996
}
1996
1997
}
1997
1998
1998
- if (AllUsedCheckers.empty () ||
1999
- AllUsedCheckers.back ().Conformance != conformance) {
2000
- continue ;
2001
- }
2002
-
2003
- auto &checker = AllUsedCheckers.back ();
2004
- auto LocalMissing = checker.getLocalMissingWitness ();
1999
+ auto LocalMissing = Context.takeDelayedMissingWitnesses (conformance);
2005
2000
if (LocalMissing.empty ())
2006
2001
continue ;
2007
2002
2003
+ MissingWitnesses.insert (LocalMissing.begin (), LocalMissing.end ());
2004
+
2008
2005
// Diagnose the missing witnesses.
2009
2006
for (auto &Missing : LocalMissing) {
2010
2007
auto requirement = Missing.requirement ;
@@ -2031,10 +2028,9 @@ void MultiConformanceChecker::checkAllConformances() {
2031
2028
2032
2029
// Otherwise, backtrack to the last checker that has missing witnesses
2033
2030
// and diagnose missing witnesses from there.
2034
- for (auto &checker : llvm::reverse (AllUsedCheckers)) {
2035
- if (!checker.getLocalMissingWitness ().empty ()) {
2036
- diagnoseProtocolStubFixit (Context,
2037
- checker.Conformance ,
2031
+ for (auto *conformance : llvm::reverse (AllConformances)) {
2032
+ if (Context.hasDelayedConformanceErrors (conformance)) {
2033
+ diagnoseProtocolStubFixit (Context, conformance,
2038
2034
MissingWitnesses.getArrayRef ());
2039
2035
break ;
2040
2036
}
@@ -2408,15 +2404,8 @@ checkIndividualConformance(NormalProtocolConformance *conformance) {
2408
2404
if (conformance->isComplete ())
2409
2405
return ;
2410
2406
2411
- // Revive registered missing witnesses to handle it below.
2412
- auto revivedMissingWitnesses =
2413
- getASTContext ().takeDelayedMissingWitnesses (conformance);
2414
-
2415
2407
// The conformance checker we're using.
2416
- AllUsedCheckers.emplace_back (getASTContext (), conformance, MissingWitnesses);
2417
- MissingWitnesses.insert (revivedMissingWitnesses.begin (),
2418
- revivedMissingWitnesses.end ());
2419
-
2408
+ AllUsedCheckers.emplace_back (getASTContext (), conformance);
2420
2409
AllUsedCheckers.back ().checkConformance ();
2421
2410
}
2422
2411
@@ -2959,13 +2948,10 @@ diagnoseMatch(ModuleDecl *module, NormalProtocolConformance *conformance,
2959
2948
}
2960
2949
2961
2950
ConformanceChecker::ConformanceChecker (
2962
- ASTContext &ctx, NormalProtocolConformance *conformance,
2963
- llvm::SetVector<ASTContext::MissingWitness> &GlobalMissingWitnesses)
2951
+ ASTContext &ctx, NormalProtocolConformance *conformance)
2964
2952
: WitnessChecker(ctx, conformance->getProtocol (), conformance->getType(),
2965
2953
conformance->getDeclContext()),
2966
- Conformance(conformance), Loc(conformance->getLoc ()),
2967
- GlobalMissingWitnesses(GlobalMissingWitnesses),
2968
- LocalMissingWitnessesStartIndex(GlobalMissingWitnesses.size()) {}
2954
+ Conformance(conformance), Loc(conformance->getLoc ()) {}
2969
2955
2970
2956
ConformanceChecker::~ConformanceChecker () {}
2971
2957
@@ -4340,7 +4326,7 @@ ConformanceChecker::resolveWitnessViaLookup(ValueDecl *requirement) {
4340
4326
if (!numViable) {
4341
4327
// Save the missing requirement for later diagnosis.
4342
4328
if (shouldRecordMissingWitness (Proto, Conformance, requirement))
4343
- GlobalMissingWitnesses. insert ( {requirement, matches});
4329
+ getASTContext (). addDelayedMissingWitness (Conformance, {requirement, matches});
4344
4330
return ResolveWitnessResult::Missing;
4345
4331
}
4346
4332
@@ -6458,12 +6444,8 @@ ValueWitnessRequest::evaluate(Evaluator &eval,
6458
6444
NormalProtocolConformance *conformance,
6459
6445
ValueDecl *requirement) const {
6460
6446
auto &ctx = requirement->getASTContext ();
6461
- llvm::SetVector<ASTContext::MissingWitness> MissingWitnesses;
6462
- ConformanceChecker checker (ctx, conformance, MissingWitnesses);
6447
+ ConformanceChecker checker (ctx, conformance);
6463
6448
checker.resolveSingleWitness (requirement);
6464
- for (auto missing : MissingWitnesses) {
6465
- ctx.addDelayedMissingWitness (conformance, missing);
6466
- }
6467
6449
6468
6450
// FIXME: ConformanceChecker and the other associated WitnessCheckers have
6469
6451
// an extremely convoluted caching scheme that doesn't fit nicely into the
0 commit comments