[Frontend] SE-0466: Add -default-isolation frontend that accepts MainActor and nonisolated

This commit is contained in:
Pavel Yaskevich
2025-03-21 16:22:34 -07:00
parent f8ab391737
commit 2221c140d2
3 changed files with 38 additions and 3 deletions

View File

@@ -969,9 +969,6 @@ static bool ParseEnabledFeatureArgs(LangOptions &Opts, ArgList &Args,
if (Args.hasArg(OPT_strict_memory_safety))
Opts.enableFeature(Feature::StrictMemorySafety);
if (Opts.hasFeature(Feature::UnspecifiedMeansMainActorIsolated))
Opts.enableFeature(Feature::InferIsolatedConformances);
return HadError;
}
@@ -1817,6 +1814,27 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
Opts.DisableDynamicActorIsolation |=
Args.hasArg(OPT_disable_dynamic_actor_isolation);
if (const Arg *A = Args.getLastArg(options::OPT_default_isolation)) {
auto behavior =
llvm::StringSwitch<std::optional<DefaultIsolation>>(A->getValue())
.Case("MainActor", DefaultIsolation::MainActor)
.Case("nonisolated", DefaultIsolation::Nonisolated)
.Default(std::nullopt);
if (behavior) {
Opts.DefaultIsolationBehavior = *behavior;
} else {
Diags.diagnose(SourceLoc(), diag::error_invalid_arg_value,
A->getAsString(Args), A->getValue());
HadError = true;
}
} else {
Opts.DefaultIsolationBehavior = DefaultIsolation::Nonisolated;
}
if (Opts.DefaultIsolationBehavior == DefaultIsolation::MainActor)
Opts.enableFeature(Feature::InferIsolatedConformances);
#if !defined(NDEBUG) && SWIFT_ENABLE_EXPERIMENTAL_PARSER_VALIDATION
/// Enable round trip parsing via the new swift parser unless it is disabled
/// explicitly. The new Swift parser can have mismatches with C++ parser -