@@ -1884,7 +1884,6 @@ class MultiConformanceChecker {
18841884 llvm::SmallVector<ValueDecl*, 16 > UnsatisfiedReqs;
18851885 llvm::SmallVector<ConformanceChecker, 4 > AllUsedCheckers;
18861886 llvm::SmallVector<NormalProtocolConformance*, 4 > AllConformances;
1887- llvm::SetVector<ASTContext::MissingWitness> MissingWitnesses;
18881887 llvm::SmallPtrSet<ValueDecl *, 8 > CoveredMembers;
18891888
18901889 // / Check one conformance.
@@ -1976,6 +1975,8 @@ static void diagnoseProtocolStubFixit(
19761975 ArrayRef<ASTContext::MissingWitness> missingWitnesses);
19771976
19781977void MultiConformanceChecker::checkAllConformances () {
1978+ llvm::SetVector<ASTContext::MissingWitness> MissingWitnesses;
1979+
19791980 bool anyInvalid = false ;
19801981 for (auto *conformance : AllConformances) {
19811982 checkIndividualConformance (conformance);
@@ -1995,16 +1996,12 @@ void MultiConformanceChecker::checkAllConformances() {
19951996 }
19961997 }
19971998
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);
20052000 if (LocalMissing.empty ())
20062001 continue ;
20072002
2003+ MissingWitnesses.insert (LocalMissing.begin (), LocalMissing.end ());
2004+
20082005 // Diagnose the missing witnesses.
20092006 for (auto &Missing : LocalMissing) {
20102007 auto requirement = Missing.requirement ;
@@ -2031,10 +2028,9 @@ void MultiConformanceChecker::checkAllConformances() {
20312028
20322029 // Otherwise, backtrack to the last checker that has missing witnesses
20332030 // 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,
20382034 MissingWitnesses.getArrayRef ());
20392035 break ;
20402036 }
@@ -2408,15 +2404,8 @@ checkIndividualConformance(NormalProtocolConformance *conformance) {
24082404 if (conformance->isComplete ())
24092405 return ;
24102406
2411- // Revive registered missing witnesses to handle it below.
2412- auto revivedMissingWitnesses =
2413- getASTContext ().takeDelayedMissingWitnesses (conformance);
2414-
24152407 // 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);
24202409 AllUsedCheckers.back ().checkConformance ();
24212410}
24222411
@@ -2959,13 +2948,10 @@ diagnoseMatch(ModuleDecl *module, NormalProtocolConformance *conformance,
29592948}
29602949
29612950ConformanceChecker::ConformanceChecker (
2962- ASTContext &ctx, NormalProtocolConformance *conformance,
2963- llvm::SetVector<ASTContext::MissingWitness> &GlobalMissingWitnesses)
2951+ ASTContext &ctx, NormalProtocolConformance *conformance)
29642952 : WitnessChecker(ctx, conformance->getProtocol (), conformance->getType(),
29652953 conformance->getDeclContext()),
2966- Conformance(conformance), Loc(conformance->getLoc ()),
2967- GlobalMissingWitnesses(GlobalMissingWitnesses),
2968- LocalMissingWitnessesStartIndex(GlobalMissingWitnesses.size()) {}
2954+ Conformance(conformance), Loc(conformance->getLoc ()) {}
29692955
29702956ConformanceChecker::~ConformanceChecker () {}
29712957
@@ -4340,7 +4326,7 @@ ConformanceChecker::resolveWitnessViaLookup(ValueDecl *requirement) {
43404326 if (!numViable) {
43414327 // Save the missing requirement for later diagnosis.
43424328 if (shouldRecordMissingWitness (Proto, Conformance, requirement))
4343- GlobalMissingWitnesses. insert ( {requirement, matches});
4329+ getASTContext (). addDelayedMissingWitness (Conformance, {requirement, matches});
43444330 return ResolveWitnessResult::Missing;
43454331 }
43464332
@@ -6458,12 +6444,8 @@ ValueWitnessRequest::evaluate(Evaluator &eval,
64586444 NormalProtocolConformance *conformance,
64596445 ValueDecl *requirement) const {
64606446 auto &ctx = requirement->getASTContext ();
6461- llvm::SetVector<ASTContext::MissingWitness> MissingWitnesses;
6462- ConformanceChecker checker (ctx, conformance, MissingWitnesses);
6447+ ConformanceChecker checker (ctx, conformance);
64636448 checker.resolveSingleWitness (requirement);
6464- for (auto missing : MissingWitnesses) {
6465- ctx.addDelayedMissingWitness (conformance, missing);
6466- }
64676449
64686450 // FIXME: ConformanceChecker and the other associated WitnessCheckers have
64696451 // an extremely convoluted caching scheme that doesn't fit nicely into the
0 commit comments