@@ -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
0 commit comments