Skip to content

Commit 15a2d30

Browse files
committed
Frontend: Lift restrictions on lazy typechecking options.
The `-experimental-skip-all-function-bodies` flag is specified when producing modules for indexing. These modules are not used for compilation, so it should be safe to allow `-experimental-lazy-typecheck` and `-experimental-skip-non-exportable-decls` as well without `-enable-library-evolution`. Resolves rdar://128706306
1 parent df1f46c commit 15a2d30

File tree

2 files changed

+25
-9
lines changed

2 files changed

+25
-9
lines changed

lib/Frontend/CompilerInvocation.cpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,14 +1159,20 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
11591159

11601160
Opts.EnableSkipExplicitInterfaceModuleBuildRemarks = Args.hasArg(OPT_remark_skip_explicit_interface_build);
11611161

1162-
if (Args.hasArg(OPT_enable_library_evolution)) {
1163-
Opts.SkipNonExportableDecls |=
1164-
Args.hasArg(OPT_experimental_skip_non_exportable_decls);
1165-
} else {
1166-
if (Args.hasArg(OPT_experimental_skip_non_exportable_decls))
1162+
if (Args.hasArg(OPT_experimental_skip_non_exportable_decls)) {
1163+
// Only allow -experimental-skip-non-exportable-decls if either library
1164+
// evolution is enabled (in which case the module's ABI is independent of
1165+
// internal declarations) or when -experimental-skip-all-function-bodies is
1166+
// present. The latter implies the module will not be used for code
1167+
// generation, so omitting details needed for ABI should be safe.
1168+
if (Args.hasArg(OPT_enable_library_evolution) ||
1169+
Args.hasArg(OPT_experimental_skip_all_function_bodies)) {
1170+
Opts.SkipNonExportableDecls |= true;
1171+
} else {
11671172
Diags.diagnose(SourceLoc(), diag::ignoring_option_requires_option,
11681173
"-experimental-skip-non-exportable-decls",
11691174
"-enable-library-evolution");
1175+
}
11701176
}
11711177

11721178
Opts.AllowNonResilientAccess =
@@ -1685,13 +1691,18 @@ static bool ParseTypeCheckerArgs(TypeCheckerOptions &Opts, ArgList &Args,
16851691
Opts.DebugGenericSignatures |= Args.hasArg(OPT_debug_generic_signatures);
16861692
Opts.DebugInverseRequirements |= Args.hasArg(OPT_debug_inverse_requirements);
16871693

1688-
if (Args.hasArg(OPT_enable_library_evolution)) {
1689-
Opts.EnableLazyTypecheck |= Args.hasArg(OPT_experimental_lazy_typecheck);
1690-
} else {
1691-
if (Args.hasArg(OPT_experimental_lazy_typecheck))
1694+
if (Args.hasArg(OPT_experimental_lazy_typecheck)) {
1695+
// Same restrictions as -experimental-skip-non-exportable-decls. These
1696+
// could be relaxed in the future, since lazy typechecking is probably not
1697+
// inherently unsafe without these options.
1698+
if (Args.hasArg(OPT_enable_library_evolution) ||
1699+
Args.hasArg(OPT_experimental_skip_all_function_bodies)) {
1700+
Opts.EnableLazyTypecheck |= Args.hasArg(OPT_experimental_lazy_typecheck);
1701+
} else {
16921702
Diags.diagnose(SourceLoc(), diag::ignoring_option_requires_option,
16931703
"-experimental-lazy-typecheck",
16941704
"-enable-library-evolution");
1705+
}
16951706
}
16961707

16971708
// HACK: The driver currently erroneously passes all flags to module interface

test/Serialization/lazy-typecheck.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
// RUN: %target-swift-frontend -swift-version 5 %S/../Inputs/lazy_typecheck.swift -module-name lazy_typecheck -enable-library-evolution -parse-as-library -package-name Package -DFLAG -emit-module -emit-module-path %t/lazy-skip-all/lazy_typecheck.swiftmodule -debug-forbid-typecheck-prefix NoTypecheck -experimental-lazy-typecheck -experimental-skip-all-function-bodies -experimental-skip-non-exportable-decls
1212
// RUN: %target-swift-frontend -package-name Package -typecheck -verify %S/../Inputs/lazy_typecheck_client.swift -DFLAG -I %t/lazy-skip-all
1313

14+
// (2a) Verify that -experimental-lazy-typecheck and -experimental-skip-non-exportable-decls do not require
15+
// -enable-library-evolution if -experimental-skip-all-function-bodies is specified.
16+
// RUN: %target-swift-frontend -swift-version 5 %S/../Inputs/lazy_typecheck.swift -module-name lazy_typecheck -parse-as-library -package-name Package -DFLAG -emit-module -emit-module-path %t/lazy-skip-all-non-resilient/lazy_typecheck.swiftmodule -debug-forbid-typecheck-prefix NoTypecheck -experimental-lazy-typecheck -experimental-skip-all-function-bodies -experimental-skip-non-exportable-decls
17+
// RUN: %target-swift-frontend -package-name Package -typecheck -verify %S/../Inputs/lazy_typecheck_client.swift -DFLAG -I %t/lazy-skip-all-non-resilient
18+
1419
// (3) Verify that a module built with -experimental-lazy-typecheck, -experimental-skip-non-inlinable-function-bodies,
1520
// and -experimental-skip-non-exportable-decls can be used by the same client as in (1).
1621
// RUN: %target-swift-frontend -swift-version 5 %S/../Inputs/lazy_typecheck.swift -module-name lazy_typecheck -enable-library-evolution -parse-as-library -package-name Package -DFLAG -emit-module -emit-module-path %t/lazy-skip-non-inlinable/lazy_typecheck.swiftmodule -debug-forbid-typecheck-prefix NoTypecheck -experimental-lazy-typecheck -experimental-skip-non-inlinable-function-bodies -experimental-skip-non-exportable-decls

0 commit comments

Comments
 (0)