@@ -1154,14 +1154,20 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
11541154
11551155 Opts.EnableSkipExplicitInterfaceModuleBuildRemarks = Args.hasArg (OPT_remark_skip_explicit_interface_build);
11561156
1157- if (Args.hasArg (OPT_enable_library_evolution)) {
1158- Opts.SkipNonExportableDecls |=
1159- Args.hasArg (OPT_experimental_skip_non_exportable_decls);
1160- } else {
1161- if (Args.hasArg (OPT_experimental_skip_non_exportable_decls))
1157+ if (Args.hasArg (OPT_experimental_skip_non_exportable_decls)) {
1158+ // Only allow -experimental-skip-non-exportable-decls if either library
1159+ // evolution is enabled (in which case the module's ABI is independent of
1160+ // internal declarations) or when -experimental-skip-all-function-bodies is
1161+ // present. The latter implies the module will not be used for code
1162+ // generation, so omitting details needed for ABI should be safe.
1163+ if (Args.hasArg (OPT_enable_library_evolution) ||
1164+ Args.hasArg (OPT_experimental_skip_all_function_bodies)) {
1165+ Opts.SkipNonExportableDecls |= true ;
1166+ } else {
11621167 Diags.diagnose (SourceLoc (), diag::ignoring_option_requires_option,
11631168 " -experimental-skip-non-exportable-decls" ,
11641169 " -enable-library-evolution" );
1170+ }
11651171 }
11661172
11671173 Opts.AllowNonResilientAccess =
@@ -1707,13 +1713,18 @@ static bool ParseTypeCheckerArgs(TypeCheckerOptions &Opts, ArgList &Args,
17071713 Opts.DebugGenericSignatures |= Args.hasArg (OPT_debug_generic_signatures);
17081714 Opts.DebugInverseRequirements |= Args.hasArg (OPT_debug_inverse_requirements);
17091715
1710- if (Args.hasArg (OPT_enable_library_evolution)) {
1711- Opts.EnableLazyTypecheck |= Args.hasArg (OPT_experimental_lazy_typecheck);
1712- } else {
1713- if (Args.hasArg (OPT_experimental_lazy_typecheck))
1716+ if (Args.hasArg (OPT_experimental_lazy_typecheck)) {
1717+ // Same restrictions as -experimental-skip-non-exportable-decls. These
1718+ // could be relaxed in the future, since lazy typechecking is probably not
1719+ // inherently unsafe without these options.
1720+ if (Args.hasArg (OPT_enable_library_evolution) ||
1721+ Args.hasArg (OPT_experimental_skip_all_function_bodies)) {
1722+ Opts.EnableLazyTypecheck |= Args.hasArg (OPT_experimental_lazy_typecheck);
1723+ } else {
17141724 Diags.diagnose (SourceLoc (), diag::ignoring_option_requires_option,
17151725 " -experimental-lazy-typecheck" ,
17161726 " -enable-library-evolution" );
1727+ }
17171728 }
17181729
17191730 if (LangOpts.AllowNonResilientAccess &&
0 commit comments