@@ -1016,12 +1016,15 @@ static bool diagnoseSingleNonSendableType(
10161016
10171017 if (type->is <FunctionType>()) {
10181018 ctx.Diags .diagnose (loc, diag::nonsendable_function_type);
1019+ } else if (nominal &&
1020+ nominal->suppressesConformance (KnownProtocolKind::Sendable)) {
1021+ nominal->diagnose (diag::sendable_conformance_is_suppressed, nominal);
10191022 } else if (nominal && nominal->getParentModule () == module ) {
10201023 // If the nominal type is in the current module, suggest adding
10211024 // `Sendable` if it might make sense. Otherwise, just complain.
10221025 if (isa<StructDecl>(nominal) || isa<EnumDecl>(nominal)) {
1023- auto note = nominal-> diagnose (
1024- diag::add_nominal_sendable_conformance, nominal);
1026+ auto note =
1027+ nominal-> diagnose ( diag::add_nominal_sendable_conformance, nominal);
10251028 addSendableFixIt (nominal, note, /* unchecked=*/ false );
10261029 } else {
10271030 nominal->diagnose (diag::non_sendable_nominal, nominal);
@@ -1302,6 +1305,9 @@ inferSendableFromInstanceStorage(NominalTypeDecl *nominal,
13021305 }
13031306 }
13041307
1308+ if (nominal->suppressesConformance (KnownProtocolKind::Sendable))
1309+ return std::nullopt ;
1310+
13051311 class Visitor : public StorageVisitor {
13061312 public:
13071313 NominalTypeDecl *nominal;
@@ -1395,6 +1401,10 @@ void swift::diagnoseMissingExplicitSendable(NominalTypeDecl *nominal) {
13951401 /* treatUsableFromInlineAsPublic=*/ true ).isPublic ())
13961402 return ;
13971403
1404+ // If `Sendable` conformance is explicitly suppressed, do nothing.
1405+ if (nominal->suppressesConformance (KnownProtocolKind::Sendable))
1406+ return ;
1407+
13981408 // If the conformance is explicitly stated, do nothing.
13991409 if (hasExplicitSendableConformance (nominal, /* applyModuleDefault=*/ false ))
14001410 return ;
@@ -7173,6 +7183,14 @@ static bool checkSendableInstanceStorage(
71737183 }
71747184 }
71757185
7186+ if (nominal->suppressesConformance (KnownProtocolKind::Sendable)) {
7187+ auto *conformanceDecl = dc->getAsDecl () ? dc->getAsDecl () : nominal;
7188+ if (!isImplicitSendableCheck (check)) {
7189+ conformanceDecl->diagnose (diag::non_sendable_type_suppressed);
7190+ }
7191+ return true ;
7192+ }
7193+
71767194 // Stored properties of structs and classes must have
71777195 // Sendable-conforming types.
71787196 class Visitor : public StorageVisitor {
@@ -7499,6 +7517,10 @@ ProtocolConformance *swift::deriveImplicitSendableConformance(
74997517 if (isa<ProtocolDecl>(nominal))
75007518 return nullptr ;
75017519
7520+ // An explicit use `~Sendable` suppresses the conformance.
7521+ if (nominal->suppressesConformance (KnownProtocolKind::Sendable))
7522+ return nullptr ;
7523+
75027524 // Actor types are always Sendable; they don't get it via this path.
75037525 auto classDecl = dyn_cast<ClassDecl>(nominal);
75047526 if (classDecl && classDecl->isActor ())
0 commit comments