@@ -1159,14 +1159,20 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
1159
1159
1160
1160
Opts.EnableSkipExplicitInterfaceModuleBuildRemarks = Args.hasArg (OPT_remark_skip_explicit_interface_build);
1161
1161
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 {
1167
1172
Diags.diagnose (SourceLoc (), diag::ignoring_option_requires_option,
1168
1173
" -experimental-skip-non-exportable-decls" ,
1169
1174
" -enable-library-evolution" );
1175
+ }
1170
1176
}
1171
1177
1172
1178
Opts.AllowNonResilientAccess =
@@ -1685,13 +1691,18 @@ static bool ParseTypeCheckerArgs(TypeCheckerOptions &Opts, ArgList &Args,
1685
1691
Opts.DebugGenericSignatures |= Args.hasArg (OPT_debug_generic_signatures);
1686
1692
Opts.DebugInverseRequirements |= Args.hasArg (OPT_debug_inverse_requirements);
1687
1693
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 {
1692
1702
Diags.diagnose (SourceLoc (), diag::ignoring_option_requires_option,
1693
1703
" -experimental-lazy-typecheck" ,
1694
1704
" -enable-library-evolution" );
1705
+ }
1695
1706
}
1696
1707
1697
1708
// HACK: The driver currently erroneously passes all flags to module interface
0 commit comments