@@ -1957,7 +1957,8 @@ void MultiConformanceChecker::checkAllConformances() {
19571957 for (auto It = AllUsedCheckers.rbegin (); It != AllUsedCheckers.rend ();
19581958 ++It) {
19591959 if (!It->getLocalMissingWitness ().empty ()) {
1960- if (It->diagnoseMissingWitnesses (MissingWitnessDiagnosisKind::FixItOnly))
1960+ if (It->diagnoseMissingWitnesses (MissingWitnessDiagnosisKind::FixItOnly,
1961+ /* Delayed=*/ false ))
19611962 break ;
19621963 }
19631964 }
@@ -3862,7 +3863,7 @@ static ArrayRef<MissingWitness> pruneMissingWitnesses(
38623863}
38633864
38643865bool ConformanceChecker::
3865- diagnoseMissingWitnesses (MissingWitnessDiagnosisKind Kind) {
3866+ diagnoseMissingWitnesses (MissingWitnessDiagnosisKind Kind, bool Delayed ) {
38663867 auto LocalMissing = getLocalMissingWitness ();
38673868
38683869 SmallVector<MissingWitness, 4 > MissingWitnessScratch;
@@ -4004,18 +4005,19 @@ diagnoseMissingWitnesses(MissingWitnessDiagnosisKind Kind) {
40044005 case MissingWitnessDiagnosisKind::ErrorFixIt: {
40054006 const auto MissingWitnesses = filterProtocolRequirements (
40064007 GlobalMissingWitnesses.getArrayRef (), Adoptee);
4007- if (SuppressDiagnostics ) {
4008+ if (Delayed ) {
40084009 // If the diagnostics are suppressed, we register these missing witnesses
40094010 // for later revisiting.
40104011 Conformance->setInvalid ();
40114012 getASTContext ().addDelayedMissingWitnesses (
40124013 Conformance,
40134014 std::make_unique<DelayedMissingWitnesses>(MissingWitnesses));
40144015 } else {
4016+ auto Loc = this ->Loc ;
40154017 diagnoseOrDefer (
40164018 LocalMissing[0 ].requirement , true ,
4017- [& ](NormalProtocolConformance *Conf) {
4018- InsertFixit (Conf, Loc, IsEditorMode, std::move ( MissingWitnesses) );
4019+ [InsertFixit, Loc, IsEditorMode, MissingWitnesses ](NormalProtocolConformance *Conf) {
4020+ InsertFixit (Conf, Loc, IsEditorMode, MissingWitnesses);
40194021 });
40204022 }
40214023 clearGlobalMissingWitnesses ();
@@ -5505,14 +5507,14 @@ void ConformanceChecker::checkConformance(MissingWitnessDiagnosisKind Kind) {
55055507 ensureRequirementsAreSatisfied ();
55065508
55075509 // Diagnose missing type witnesses for now.
5508- diagnoseMissingWitnesses (Kind);
5509-
5510- // Diagnose missing value witnesses later.
5511- SWIFT_DEFER { diagnoseMissingWitnesses (Kind); };
5510+ diagnoseMissingWitnesses (Kind, /* Delayed=*/ false );
55125511
55135512 // Check non-type requirements.
55145513 resolveValueWitnesses ();
55155514
5515+ // Diagnose missing value witnesses.
5516+ diagnoseMissingWitnesses (Kind, /* Delayed=*/ false );
5517+
55165518 emitDelayedDiags ();
55175519
55185520 // Except in specific hardcoded cases for Foundation/Swift
@@ -6985,7 +6987,8 @@ TypeWitnessRequest::evaluate(Evaluator &eval,
69856987 ConformanceChecker checker (requirement->getASTContext (), conformance,
69866988 MissingWitnesses);
69876989 checker.resolveSingleTypeWitness (requirement);
6988- checker.diagnoseMissingWitnesses (MissingWitnessDiagnosisKind::ErrorFixIt);
6990+ checker.diagnoseMissingWitnesses (MissingWitnessDiagnosisKind::ErrorFixIt,
6991+ /* Delayed=*/ true );
69896992 // FIXME: ConformanceChecker and the other associated WitnessCheckers have
69906993 // an extremely convoluted caching scheme that doesn't fit nicely into the
69916994 // evaluator's model. All of this should be refactored away.
@@ -7003,7 +7006,8 @@ ValueWitnessRequest::evaluate(Evaluator &eval,
70037006 ConformanceChecker checker (requirement->getASTContext (), conformance,
70047007 MissingWitnesses);
70057008 checker.resolveSingleWitness (requirement);
7006- checker.diagnoseMissingWitnesses (MissingWitnessDiagnosisKind::ErrorFixIt);
7009+ checker.diagnoseMissingWitnesses (MissingWitnessDiagnosisKind::ErrorFixIt,
7010+ /* Delayed=*/ true );
70077011 // FIXME: ConformanceChecker and the other associated WitnessCheckers have
70087012 // an extremely convoluted caching scheme that doesn't fit nicely into the
70097013 // evaluator's model. All of this should be refactored away.
0 commit comments