@@ -1957,7 +1957,8 @@ void MultiConformanceChecker::checkAllConformances() {
1957
1957
for (auto It = AllUsedCheckers.rbegin (); It != AllUsedCheckers.rend ();
1958
1958
++It) {
1959
1959
if (!It->getLocalMissingWitness ().empty ()) {
1960
- if (It->diagnoseMissingWitnesses (MissingWitnessDiagnosisKind::FixItOnly))
1960
+ if (It->diagnoseMissingWitnesses (MissingWitnessDiagnosisKind::FixItOnly,
1961
+ /* Delayed=*/ false ))
1961
1962
break ;
1962
1963
}
1963
1964
}
@@ -3862,7 +3863,7 @@ static ArrayRef<MissingWitness> pruneMissingWitnesses(
3862
3863
}
3863
3864
3864
3865
bool ConformanceChecker::
3865
- diagnoseMissingWitnesses (MissingWitnessDiagnosisKind Kind) {
3866
+ diagnoseMissingWitnesses (MissingWitnessDiagnosisKind Kind, bool Delayed ) {
3866
3867
auto LocalMissing = getLocalMissingWitness ();
3867
3868
3868
3869
SmallVector<MissingWitness, 4 > MissingWitnessScratch;
@@ -4004,18 +4005,19 @@ diagnoseMissingWitnesses(MissingWitnessDiagnosisKind Kind) {
4004
4005
case MissingWitnessDiagnosisKind::ErrorFixIt: {
4005
4006
const auto MissingWitnesses = filterProtocolRequirements (
4006
4007
GlobalMissingWitnesses.getArrayRef (), Adoptee);
4007
- if (SuppressDiagnostics ) {
4008
+ if (Delayed ) {
4008
4009
// If the diagnostics are suppressed, we register these missing witnesses
4009
4010
// for later revisiting.
4010
4011
Conformance->setInvalid ();
4011
4012
getASTContext ().addDelayedMissingWitnesses (
4012
4013
Conformance,
4013
4014
std::make_unique<DelayedMissingWitnesses>(MissingWitnesses));
4014
4015
} else {
4016
+ auto Loc = this ->Loc ;
4015
4017
diagnoseOrDefer (
4016
4018
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);
4019
4021
});
4020
4022
}
4021
4023
clearGlobalMissingWitnesses ();
@@ -5505,14 +5507,14 @@ void ConformanceChecker::checkConformance(MissingWitnessDiagnosisKind Kind) {
5505
5507
ensureRequirementsAreSatisfied ();
5506
5508
5507
5509
// 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 );
5512
5511
5513
5512
// Check non-type requirements.
5514
5513
resolveValueWitnesses ();
5515
5514
5515
+ // Diagnose missing value witnesses.
5516
+ diagnoseMissingWitnesses (Kind, /* Delayed=*/ false );
5517
+
5516
5518
emitDelayedDiags ();
5517
5519
5518
5520
// Except in specific hardcoded cases for Foundation/Swift
@@ -6985,7 +6987,8 @@ TypeWitnessRequest::evaluate(Evaluator &eval,
6985
6987
ConformanceChecker checker (requirement->getASTContext (), conformance,
6986
6988
MissingWitnesses);
6987
6989
checker.resolveSingleTypeWitness (requirement);
6988
- checker.diagnoseMissingWitnesses (MissingWitnessDiagnosisKind::ErrorFixIt);
6990
+ checker.diagnoseMissingWitnesses (MissingWitnessDiagnosisKind::ErrorFixIt,
6991
+ /* Delayed=*/ true );
6989
6992
// FIXME: ConformanceChecker and the other associated WitnessCheckers have
6990
6993
// an extremely convoluted caching scheme that doesn't fit nicely into the
6991
6994
// evaluator's model. All of this should be refactored away.
@@ -7003,7 +7006,8 @@ ValueWitnessRequest::evaluate(Evaluator &eval,
7003
7006
ConformanceChecker checker (requirement->getASTContext (), conformance,
7004
7007
MissingWitnesses);
7005
7008
checker.resolveSingleWitness (requirement);
7006
- checker.diagnoseMissingWitnesses (MissingWitnessDiagnosisKind::ErrorFixIt);
7009
+ checker.diagnoseMissingWitnesses (MissingWitnessDiagnosisKind::ErrorFixIt,
7010
+ /* Delayed=*/ true );
7007
7011
// FIXME: ConformanceChecker and the other associated WitnessCheckers have
7008
7012
// an extremely convoluted caching scheme that doesn't fit nicely into the
7009
7013
// evaluator's model. All of this should be refactored away.
0 commit comments