@@ -1154,14 +1154,20 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
1154
1154
1155
1155
Opts.EnableSkipExplicitInterfaceModuleBuildRemarks = Args.hasArg (OPT_remark_skip_explicit_interface_build);
1156
1156
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 {
1162
1167
Diags.diagnose (SourceLoc (), diag::ignoring_option_requires_option,
1163
1168
" -experimental-skip-non-exportable-decls" ,
1164
1169
" -enable-library-evolution" );
1170
+ }
1165
1171
}
1166
1172
1167
1173
Opts.AllowNonResilientAccess =
@@ -1707,13 +1713,18 @@ static bool ParseTypeCheckerArgs(TypeCheckerOptions &Opts, ArgList &Args,
1707
1713
Opts.DebugGenericSignatures |= Args.hasArg (OPT_debug_generic_signatures);
1708
1714
Opts.DebugInverseRequirements |= Args.hasArg (OPT_debug_inverse_requirements);
1709
1715
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 {
1714
1724
Diags.diagnose (SourceLoc (), diag::ignoring_option_requires_option,
1715
1725
" -experimental-lazy-typecheck" ,
1716
1726
" -enable-library-evolution" );
1727
+ }
1717
1728
}
1718
1729
1719
1730
if (LangOpts.AllowNonResilientAccess &&
0 commit comments