|
15 | 15 | //===----------------------------------------------------------------------===// |
16 | 16 | #include "MiscDiagnostics.h" |
17 | 17 | #include "TypeCheckAvailability.h" |
| 18 | +#include "TypeCheckConcurrency.h" |
18 | 19 | #include "TypeCheckDecl.h" |
19 | 20 | #include "TypeCheckObjC.h" |
20 | 21 | #include "TypeChecker.h" |
@@ -548,12 +549,20 @@ static void diagnoseGeneralOverrideFailure(ValueDecl *decl, |
548 | 549 | diags.diagnose(decl, diag::override_multiple_decls_base, |
549 | 550 | decl->getName()); |
550 | 551 | break; |
551 | | - case OverrideCheckingAttempt::MismatchedSendability: |
552 | | - // FIXME: suppress if any matches brought in via @preconcurrency import? |
553 | | - diags.diagnose(decl, diag::override_sendability_mismatch, |
554 | | - decl->getName()) |
555 | | - .warnUntilSwiftVersion(6); |
| 552 | + case OverrideCheckingAttempt::MismatchedSendability: { |
| 553 | + SendableCheckContext fromContext(decl->getDeclContext(), |
| 554 | + SendableCheck::Explicit); |
| 555 | + auto baseDeclClass = |
| 556 | + decl->getOverriddenDecl()->getDeclContext()->getSelfClassDecl(); |
| 557 | + |
| 558 | + diagnoseSendabilityErrorBasedOn(baseDeclClass, fromContext, |
| 559 | + [&](DiagnosticBehavior limit) { |
| 560 | + diags.diagnose(decl, diag::override_sendability_mismatch, decl->getName()) |
| 561 | + .limitBehavior(limit); |
| 562 | + return false; |
| 563 | + }); |
556 | 564 | break; |
| 565 | + } |
557 | 566 | case OverrideCheckingAttempt::BaseName: |
558 | 567 | diags.diagnose(decl, diag::override_multiple_decls_arg_mismatch, |
559 | 568 | decl->getName()); |
@@ -1288,11 +1297,19 @@ bool OverrideMatcher::checkOverride(ValueDecl *baseDecl, |
1288 | 1297 | return true; |
1289 | 1298 |
|
1290 | 1299 | if (attempt == OverrideCheckingAttempt::MismatchedSendability) { |
1291 | | - // FIXME: suppress if any matches brought in via @preconcurrency import? |
1292 | | - diags.diagnose(decl, diag::override_sendability_mismatch, |
1293 | | - decl->getName()) |
1294 | | - .warnUntilSwiftVersion(6); |
1295 | | - diags.diagnose(baseDecl, diag::overridden_here); |
| 1300 | + SendableCheckContext fromContext(decl->getDeclContext(), |
| 1301 | + SendableCheck::Explicit); |
| 1302 | + auto baseDeclClass = baseDecl->getDeclContext()->getSelfClassDecl(); |
| 1303 | + |
| 1304 | + diagnoseSendabilityErrorBasedOn(baseDeclClass, fromContext, |
| 1305 | + [&](DiagnosticBehavior limit) { |
| 1306 | + diags.diagnose(decl, diag::override_sendability_mismatch, |
| 1307 | + decl->getName()) |
| 1308 | + .limitBehavior(limit); |
| 1309 | + diags.diagnose(baseDecl, diag::overridden_here) |
| 1310 | + .limitBehavior(limit); |
| 1311 | + return false; |
| 1312 | + }); |
1296 | 1313 | } |
1297 | 1314 | // Catch-all to make sure we don't silently accept something we shouldn't. |
1298 | 1315 | else if (attempt != OverrideCheckingAttempt::PerfectMatch) { |
|
0 commit comments