Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions include/swift/AST/DiagnosticGroups.def
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ GROUP(TemporaryPointers,none,"temporary-pointers")
GROUP(TrailingClosureMatching,none,"trailing-closure-matching")
GROUP(UnknownWarningGroup,none,"unknown-warning-group")
GROUP(WeakMutability,none,"weak-mutability")
GROUP(ExplicitSendable,DefaultIgnoreWarnings,"explicit-sendable-annotations")

GROUP_LINK(PerformanceHints,ExistentialType)
GROUP_LINK(PerformanceHints,ReturnTypeImplicitCopy)
Expand Down
6 changes: 3 additions & 3 deletions include/swift/AST/DiagnosticsSema.def
Original file line number Diff line number Diff line change
Expand Up @@ -2857,9 +2857,9 @@ WARNING(remove_public_import,none,
WARNING(remove_package_import,none,
"package import of %0 was not used in package declarations",
(Identifier))
WARNING(public_decl_needs_sendable,none,
"public %kind0 does not specify whether it is 'Sendable' or not",
(const ValueDecl *))
GROUPED_WARNING(public_decl_needs_sendable,ExplicitSendable,none,
"public %kind0 does not specify whether it is 'Sendable' or not",
(const ValueDecl *))
NOTE(explicit_disable_sendable,none,
"make %kind0 explicitly non-Sendable to suppress this warning",
(const ValueDecl *))
Expand Down
3 changes: 0 additions & 3 deletions include/swift/Basic/LangOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -245,9 +245,6 @@ namespace swift {
// Availability macros definitions to be expanded at parsing.
SmallVector<std::string, 4> AvailabilityMacros;

/// Require public declarations to declare that they are Sendable (or not).
bool RequireExplicitSendable = false;

/// Detect and automatically import modules' cross-import overlays.
bool EnableCrossImportOverlays = false;

Expand Down
9 changes: 8 additions & 1 deletion lib/Frontend/CompilerInvocation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1272,7 +1272,6 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
if (Args.getLastArg(OPT_debug_cycles))
Opts.DebugDumpCycles = true;

Opts.RequireExplicitSendable |= Args.hasArg(OPT_require_explicit_sendable);
for (const Arg *A : Args.filtered(OPT_define_availability)) {
Opts.AvailabilityMacros.push_back(A->getValue());
}
Expand Down Expand Up @@ -2724,6 +2723,14 @@ static bool ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
}
}());
}

// `-require-explicit-sendable` is an alias to `-Wwarning ExplicitSendable`.
if (Args.hasArg(OPT_require_explicit_sendable) &&
!Args.hasArg(OPT_suppress_warnings)) {
Opts.WarningsAsErrorsRules.push_back(WarningAsErrorRule(
WarningAsErrorRule::Action::Disable, "ExplicitSendable"));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i find this slightly confusing based just on the naming of things... does 'disable' in this context mean the 'by default ignored warning' behavior is what's being disabled?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@artemcm is working on improvements to these APIs at the moment.

}

if (Args.hasArg(OPT_debug_diagnostic_names)) {
Opts.PrintDiagnosticNames = PrintDiagnosticNamesMode::Identifier;
}
Expand Down
3 changes: 2 additions & 1 deletion lib/Sema/TypeCheckConcurrency.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "swift/AST/ASTWalker.h"
#include "swift/AST/Concurrency.h"
#include "swift/AST/ConformanceLookup.h"
#include "swift/AST/DiagnosticGroups.h"
#include "swift/AST/DistributedDecl.h"
#include "swift/AST/ExistentialLayout.h"
#include "swift/AST/GenericEnvironment.h"
Expand Down Expand Up @@ -1376,7 +1377,7 @@ static bool checkSendableInstanceStorage(
void swift::diagnoseMissingExplicitSendable(NominalTypeDecl *nominal) {
// Only diagnose when explicitly requested.
ASTContext &ctx = nominal->getASTContext();
if (!ctx.LangOpts.RequireExplicitSendable)
if (ctx.Diags.isIgnoredDiagnosticGroupTree(DiagGroupID::ExplicitSendable))
return;

if (nominal->getLoc().isInvalid())
Expand Down
3 changes: 3 additions & 0 deletions test/Concurrency/objc_require_explicit_sendable.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-sil -o /dev/null -I %S/Inputs/custom-modules %s -verify -parse-as-library -Wwarning ExplicitSendable
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-sil -o /dev/null -I %S/Inputs/custom-modules %s -verify -parse-as-library -Wwarning ExplicitSendable -strict-concurrency=targeted
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-sil -o /dev/null -I %S/Inputs/custom-modules %s -verify -parse-as-library -Wwarning ExplicitSendable -strict-concurrency=complete
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-sil -o /dev/null -I %S/Inputs/custom-modules %s -verify -parse-as-library -require-explicit-sendable
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-sil -o /dev/null -I %S/Inputs/custom-modules %s -verify -parse-as-library -require-explicit-sendable -strict-concurrency=targeted
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-sil -o /dev/null -I %S/Inputs/custom-modules %s -verify -parse-as-library -require-explicit-sendable -strict-concurrency=complete
Expand Down
2 changes: 1 addition & 1 deletion test/Concurrency/require-explicit-sendable.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// RUN: %target-swift-frontend -Wwarning ExplicitSendable -strict-concurrency=complete %s -emit-sil -o /dev/null -verify
// RUN: %target-swift-frontend -require-explicit-sendable -strict-concurrency=complete %s -emit-sil -o /dev/null -verify


public protocol P { }

// expected-note@+2{{consider making struct 'S1' conform to the 'Sendable' protocol}}{{18-18=: Sendable}}
Expand Down
30 changes: 30 additions & 0 deletions userdocs/diagnostics/explicit-sendable-annotations.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Explicit Sendable annotations on public type declarations

If a public type doesn't have an explicit Sendable or non-Sendable annotation it is sometimes hard to discern whether that is intentional or not, especially if a type could be Sendable.

## Overview

The Swift compiler would emit a warning if a public type has none of the following:

- A conformance to `Sendable` protocol;
- An unavailable conformance to `Sendable` protocol;
- `~Sendable` conformance to suppress the inference.

Let's consider a simple public type without any Senable annotations:

```
public struct S {
let x: Int
}
```

When compiling with `-Wwarning ExplicitSendable` the following warning is going to be produced by the Swift compiler:

```
1 | public struct S {
| |- warning: public struct 'S' does not specify whether it is 'Sendable' or not [#ExplicitSendable]
| |- note: consider making struct 'S' conform to the 'Sendable' protocol
| `- note: make struct 'S' explicitly non-Sendable to suppress this warning
2 | let x: Int
3 | }
```