mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[Frontend] Diagnose rather than exit/assert on experimental features
Diagnose rather than exit when using experimental features that cannot be enabled in production. Also diagnose if using a compiler without `SwiftCompilerSources` when enabling embedded. This is especially important for long-running services like sourcekitd, which shouldn't exit just because an invalid argument was passed. Resolves rdar://119724074.
This commit is contained in:
@@ -563,6 +563,12 @@ ERROR(objc_with_embedded,none,
|
||||
"Objective-C interoperability cannot be enabled with embedded Swift.", ())
|
||||
ERROR(no_allocations_without_embedded,none,
|
||||
"-no-allocations is only applicable with embedded Swift.", ())
|
||||
ERROR(no_swift_sources_with_embedded,none,
|
||||
"embedded swift cannot be enabled in a compiler built without Swift sources", ())
|
||||
|
||||
ERROR(experimental_not_supported_in_production,none,
|
||||
"experimental feature '%0' cannot be enabled in production compiler",
|
||||
(StringRef))
|
||||
|
||||
#define UNDEFINE_DIAGNOSTIC_MACROS
|
||||
#include "DefineDiagnosticMacros.h"
|
||||
|
||||
@@ -845,13 +845,15 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
|
||||
if (auto feature = getExperimentalFeature(value)) {
|
||||
#ifdef NDEBUG
|
||||
if (!isFeatureAvailableInProduction(*feature)) {
|
||||
llvm::errs() << "error: experimental feature '" << A->getValue()
|
||||
<< "' cannot be enabled in a production compiler\n";
|
||||
exit(1);
|
||||
Diags.diagnose(SourceLoc(), diag::experimental_not_supported_in_production,
|
||||
A->getValue());
|
||||
HadError = true;
|
||||
} else {
|
||||
Opts.Features.insert(*feature);
|
||||
}
|
||||
#endif
|
||||
|
||||
#else
|
||||
Opts.Features.insert(*feature);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Hack: In order to support using availability macros in SPM packages, we
|
||||
@@ -1368,12 +1370,15 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
|
||||
Opts.BypassResilienceChecks |= Args.hasArg(OPT_bypass_resilience);
|
||||
|
||||
if (Opts.hasFeature(Feature::Embedded)) {
|
||||
assert(swiftModulesInitialized() && "no SwiftCompilerSources");
|
||||
|
||||
Opts.UnavailableDeclOptimizationMode = UnavailableDeclOptimization::Complete;
|
||||
Opts.DisableImplicitStringProcessingModuleImport = true;
|
||||
Opts.DisableImplicitConcurrencyModuleImport = true;
|
||||
|
||||
if (!swiftModulesInitialized()) {
|
||||
Diags.diagnose(SourceLoc(), diag::no_swift_sources_with_embedded);
|
||||
HadError = true;
|
||||
}
|
||||
|
||||
if (FrontendOpts.EnableLibraryEvolution) {
|
||||
Diags.diagnose(SourceLoc(), diag::evolution_with_embedded);
|
||||
HadError = true;
|
||||
|
||||
Reference in New Issue
Block a user