@@ -3876,7 +3876,7 @@ diagnoseMissingWitnesses(MissingWitnessDiagnosisKind Kind, bool Delayed) {
38763876 auto matches = Missing.matches ;
38773877 auto nominal = DC->getSelfNominalTypeDecl ();
38783878
3879- diagnoseOrDefer (requirement , true ,
3879+ getASTContext (). addDelayedConformanceDiag (Conformance , true ,
38803880 [requirement, matches, nominal](NormalProtocolConformance *conformance) {
38813881 auto dc = conformance->getDeclContext ();
38823882 auto *protocol = conformance->getProtocol ();
@@ -4010,8 +4010,7 @@ diagnoseMissingWitnesses(MissingWitnessDiagnosisKind Kind, bool Delayed) {
40104010 std::make_unique<DelayedMissingWitnesses>(MissingWitnesses));
40114011 } else {
40124012 auto Loc = this ->Loc ;
4013- diagnoseOrDefer (
4014- LocalMissing[0 ].requirement , true ,
4013+ getASTContext ().addDelayedConformanceDiag (Conformance, true ,
40154014 [InsertFixit, Loc, IsEditorMode, MissingWitnesses](NormalProtocolConformance *Conf) {
40164015 InsertFixit (Conf, Loc, IsEditorMode, MissingWitnesses);
40174016 });
@@ -4020,8 +4019,8 @@ diagnoseMissingWitnesses(MissingWitnessDiagnosisKind Kind, bool Delayed) {
40204019 return true ;
40214020 }
40224021 case MissingWitnessDiagnosisKind::ErrorOnly: {
4023- diagnoseOrDefer (
4024- LocalMissing[ 0 ]. requirement , true , [](NormalProtocolConformance *) {});
4022+ getASTContext (). addDelayedConformanceDiag (Conformance, true ,
4023+ [](NormalProtocolConformance *) {});
40254024 return true ;
40264025 }
40274026 case MissingWitnessDiagnosisKind::FixItOnly:
@@ -4125,7 +4124,7 @@ void ConformanceChecker::checkNonFinalClassWitness(ValueDecl *requirement,
41254124 !ctor->hasClangNode ()) {
41264125 // FIXME: We're not recovering (in the AST), so the Fix-It
41274126 // should move.
4128- diagnoseOrDefer (requirement , false ,
4127+ getASTContext (). addDelayedConformanceDiag (Conformance , false ,
41294128 [ctor, requirement](NormalProtocolConformance *conformance) {
41304129 bool inExtension = isa<ExtensionDecl>(ctor->getDeclContext ());
41314130 auto &diags = ctor->getASTContext ().Diags ;
@@ -4159,7 +4158,7 @@ void ConformanceChecker::checkNonFinalClassWitness(ValueDecl *requirement,
41594158 // References to Self in a position where subclasses cannot do
41604159 // the right thing. Complain if the adoptee is a non-final
41614160 // class.
4162- diagnoseOrDefer (requirement , false ,
4161+ getASTContext (). addDelayedConformanceDiag (Conformance , false ,
41634162 [witness, requirement](NormalProtocolConformance *conformance) {
41644163 auto proto = conformance->getProtocol ();
41654164 auto &diags = proto->getASTContext ().Diags ;
@@ -4187,7 +4186,7 @@ void ConformanceChecker::checkNonFinalClassWitness(ValueDecl *requirement,
41874186 }();
41884187
41894188 if (!hasDynamicSelfResult) {
4190- diagnoseOrDefer (requirement , false ,
4189+ getASTContext (). addDelayedConformanceDiag (Conformance , false ,
41914190 [witness, requirement](NormalProtocolConformance *conformance) {
41924191 auto proto = conformance->getProtocol ();
41934192 auto &diags = proto->getASTContext ().Diags ;
@@ -4236,7 +4235,7 @@ void ConformanceChecker::checkNonFinalClassWitness(ValueDecl *requirement,
42364235 if (isa<FuncDecl>(witness) || isa<SubscriptDecl>(witness)) {
42374236 if (witness->getDeclContext ()->getExtendedProtocolDecl ()) {
42384237 if (selfRefInfo.hasCovariantSelfResult && selfRefInfo.assocTypeRef ) {
4239- diagnoseOrDefer (requirement , false ,
4238+ getASTContext (). addDelayedConformanceDiag (Conformance , false ,
42404239 [witness, requirement](NormalProtocolConformance *conformance) {
42414240 auto proto = conformance->getProtocol ();
42424241 auto &diags = proto->getASTContext ().Diags ;
@@ -4318,7 +4317,7 @@ ConformanceChecker::resolveWitnessViaLookup(ValueDecl *requirement) {
43184317 requirement->getName () != best.Witness ->getName () &&
43194318 !witnessHasImplementsAttrForRequiredName (best.Witness , requirement)) {
43204319
4321- diagnoseOrDefer (requirement , false ,
4320+ getASTContext (). addDelayedConformanceDiag (Conformance , false ,
43224321 [witness, requirement](NormalProtocolConformance *conformance) {
43234322 auto proto = conformance->getProtocol ();
43244323 auto &diags = proto->getASTContext ().Diags ;
@@ -4350,7 +4349,7 @@ ConformanceChecker::resolveWitnessViaLookup(ValueDecl *requirement) {
43504349
43514350 // Avoid relying on the lifetime of 'this'.
43524351 const DeclContext *DC = this ->DC ;
4353- diagnoseOrDefer (requirement , isError,
4352+ getASTContext (). addDelayedConformanceDiag (Conformance , isError,
43544353 [DC, requirement, witness, sendFrom](
43554354 NormalProtocolConformance *conformance) {
43564355 diagnoseSendabilityErrorBasedOn (conformance->getProtocol (), sendFrom,
@@ -4393,7 +4392,7 @@ ConformanceChecker::resolveWitnessViaLookup(ValueDecl *requirement) {
43934392
43944393 // Avoid relying on the lifetime of 'this'.
43954394 const DeclContext *DC = this ->DC ;
4396- diagnoseOrDefer (requirement , false ,
4395+ getASTContext (). addDelayedConformanceDiag (Conformance , false ,
43974396 [DC, witness, check, requirement](
43984397 NormalProtocolConformance *conformance) {
43994398 auto requiredAccessScope = check.RequiredAccessScope ;
@@ -4426,11 +4425,12 @@ ConformanceChecker::resolveWitnessViaLookup(ValueDecl *requirement) {
44264425 }
44274426
44284427 case CheckKind::UsableFromInline:
4429- diagnoseOrDefer (requirement, false , DiagnoseUsableFromInline (witness));
4428+ getASTContext ().addDelayedConformanceDiag (Conformance, false ,
4429+ DiagnoseUsableFromInline (witness));
44304430 break ;
44314431
44324432 case CheckKind::Availability: {
4433- diagnoseOrDefer (requirement , false ,
4433+ getASTContext (). addDelayedConformanceDiag (Conformance , false ,
44344434 [witness, requirement, check](
44354435 NormalProtocolConformance *conformance) {
44364436 // FIXME: The problem may not be the OS version.
@@ -4459,7 +4459,7 @@ ConformanceChecker::resolveWitnessViaLookup(ValueDecl *requirement) {
44594459 case CheckKind::OptionalityConflict: {
44604460 auto adjustments = best.OptionalAdjustments ;
44614461
4462- diagnoseOrDefer (requirement , false ,
4462+ getASTContext (). addDelayedConformanceDiag (Conformance , false ,
44634463 [witness, adjustments, requirement](NormalProtocolConformance *conformance) {
44644464 auto proto = conformance->getProtocol ();
44654465 auto &ctx = witness->getASTContext ();
@@ -4490,7 +4490,7 @@ ConformanceChecker::resolveWitnessViaLookup(ValueDecl *requirement) {
44904490 }
44914491
44924492 case CheckKind::ConstructorFailability:
4493- diagnoseOrDefer (requirement , false ,
4493+ getASTContext (). addDelayedConformanceDiag (Conformance , false ,
44944494 [witness, requirement](NormalProtocolConformance *conformance) {
44954495 auto ctor = cast<ConstructorDecl>(requirement);
44964496 auto witnessCtor = cast<ConstructorDecl>(witness);
@@ -4505,9 +4505,8 @@ ConformanceChecker::resolveWitnessViaLookup(ValueDecl *requirement) {
45054505 break ;
45064506
45074507 case CheckKind::WitnessUnavailable:
4508- diagnoseOrDefer (requirement, /* isError=*/ true ,
4509- [witness, requirement](
4510- NormalProtocolConformance *conformance) {
4508+ getASTContext ().addDelayedConformanceDiag (Conformance, true ,
4509+ [witness, requirement](NormalProtocolConformance *conformance) {
45114510 auto &diags = witness->getASTContext ().Diags ;
45124511 SourceLoc diagLoc = getLocForDiagnosingWitness (conformance, witness);
45134512 auto *attr = AvailableAttr::isUnavailable (witness);
@@ -4572,7 +4571,7 @@ ConformanceChecker::resolveWitnessViaLookup(ValueDecl *requirement) {
45724571 return ResolveWitnessResult::Missing;
45734572 }
45744573
4575- diagnoseOrDefer (requirement , true ,
4574+ getASTContext (). addDelayedConformanceDiag (Conformance , true ,
45764575 [requirement, matches, ignoringNames](
45774576 NormalProtocolConformance *conformance) {
45784577 auto dc = conformance->getDeclContext ();
@@ -4632,7 +4631,7 @@ ResolveWitnessResult ConformanceChecker::resolveWitnessViaDerivation(
46324631 }
46334632
46344633 // Derivation failed.
4635- diagnoseOrDefer (requirement , true ,
4634+ getASTContext (). addDelayedConformanceDiag (Conformance , true ,
46364635 [](NormalProtocolConformance *conformance) {
46374636 auto proto = conformance->getProtocol ();
46384637 auto &diags = proto->getASTContext ().Diags ;
@@ -4911,7 +4910,7 @@ ResolveWitnessResult ConformanceChecker::resolveTypeWitnessViaLookup(
49114910
49124911 // If we had multiple viable types, diagnose the ambiguity.
49134912 if (!viable.empty ()) {
4914- diagnoseOrDefer (assocType , true ,
4913+ getASTContext (). addDelayedConformanceDiag (Conformance , true ,
49154914 [assocType, viable](NormalProtocolConformance *conformance) {
49164915 auto &diags = assocType->getASTContext ().Diags ;
49174916 diags.diagnose (assocType, diag::ambiguous_witnesses_type,
@@ -4927,7 +4926,7 @@ ResolveWitnessResult ConformanceChecker::resolveTypeWitnessViaLookup(
49274926 GlobalMissingWitnesses.insert ({assocType, {}});
49284927
49294928 // None of the candidates were viable.
4930- diagnoseOrDefer (assocType , true ,
4929+ getASTContext (). addDelayedConformanceDiag (Conformance , true ,
49314930 [nonViable](NormalProtocolConformance *conformance) {
49324931 auto &diags = conformance->getDeclContext ()->getASTContext ().Diags ;
49334932 for (auto candidate : nonViable) {
@@ -5112,7 +5111,7 @@ void ConformanceChecker::ensureRequirementsAreSatisfied() {
51125111 if (!Conformance->isInvalid ()) {
51135112 if (result.getKind () == CheckRequirementsResult::RequirementFailure) {
51145113 auto Loc = this ->Loc ;
5115- diagnoseOrDefer ( nullptr , /* isError=*/ true ,
5114+ getASTContext (). addDelayedConformanceDiag (Conformance , /* isError=*/ true ,
51165115 [Loc, result, proto, substitutions, module ](NormalProtocolConformance *conformance) {
51175116 TypeChecker::diagnoseRequirementFailure (
51185117 result.getRequirementFailureInfo (), Loc, Loc,
@@ -5147,7 +5146,7 @@ void ConformanceChecker::ensureRequirementsAreSatisfied() {
51475146 const DeclContext *DC = this ->DC ;
51485147 auto requiredAccessScope = getRequiredAccessScope ();
51495148
5150- diagnoseOrDefer (assocType , false ,
5149+ getASTContext (). addDelayedConformanceDiag (Conformance , false ,
51515150 [DC, requiredAccessScope, typeDecl](
51525151 NormalProtocolConformance *conformance) {
51535152 AccessLevel requiredAccess =
@@ -5170,7 +5169,8 @@ void ConformanceChecker::ensureRequirementsAreSatisfied() {
51705169 bool witnessIsUsableFromInline = typeDecl->getFormalAccessScope (
51715170 DC, /* usableFromInlineAsPublic*/ true ).isPublic ();
51725171 if (!witnessIsUsableFromInline)
5173- diagnoseOrDefer (assocType, false , DiagnoseUsableFromInline (typeDecl));
5172+ getASTContext ().addDelayedConformanceDiag (Conformance, false ,
5173+ DiagnoseUsableFromInline (typeDecl));
51745174 }
51755175 }
51765176
@@ -5707,20 +5707,6 @@ void swift::diagnoseConformanceFailure(Type T,
57075707 T, Proto->getDeclaredInterfaceType ());
57085708}
57095709
5710- void ConformanceChecker::diagnoseOrDefer (
5711- const ValueDecl *requirement, bool isError,
5712- std::function<void (NormalProtocolConformance *)> fn) {
5713- if (isError)
5714- Conformance->setInvalid ();
5715-
5716- // Stash this in the ASTContext for later emission.
5717- auto conformance = Conformance;
5718-
5719- getASTContext ().addDelayedConformanceDiag (
5720- conformance,
5721- {requirement, [conformance, fn] { fn (conformance); }, isError});
5722- }
5723-
57245710void ConformanceChecker::emitDelayedDiags () {
57255711 auto diags = getASTContext ().takeDelayedConformanceDiags (Conformance);
57265712
@@ -5731,7 +5717,7 @@ void ConformanceChecker::emitDelayedDiags() {
57315717 AlreadyComplained = true ;
57325718 }
57335719
5734- diag.Callback ();
5720+ diag.Callback (Conformance );
57355721 }
57365722}
57375723
0 commit comments