diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 6856112b062bc..f50f5575c07b6 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -563,6 +563,17 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args, OPT_disable_deserialization_safety)) { Opts.EnableDeserializationSafety = A->getOption().matches(OPT_enable_deserialization_safety); + } else if (auto A = Args.getLastArg(OPT_enable_access_control, + OPT_disable_access_control)) { + // Disable deserialization safety along with access control. + Opts.EnableDeserializationSafety + = A->getOption().matches(OPT_enable_access_control); + } + + if (auto A = Args.getLastArg(OPT_enable_access_control, + OPT_disable_access_control)) { + Opts.EnableAccessControl + = A->getOption().matches(OPT_enable_access_control); } // Whether '/.../' regex literals are enabled. This implies experimental @@ -616,12 +627,6 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args, Args.hasArg(OPT_warn_on_potentially_unavailable_enum_case); Opts.WarnOnEditorPlaceholder |= Args.hasArg(OPT_warn_on_editor_placeholder); - if (auto A = Args.getLastArg(OPT_enable_access_control, - OPT_disable_access_control)) { - Opts.EnableAccessControl - = A->getOption().matches(OPT_enable_access_control); - } - if (auto A = Args.getLastArg(OPT_disable_typo_correction, OPT_typo_correction_limit)) { if (A->getOption().matches(OPT_disable_typo_correction)) diff --git a/lib/Serialization/Serialization.cpp b/lib/Serialization/Serialization.cpp index 42837bffa6462..cc6f9fe09a86a 100644 --- a/lib/Serialization/Serialization.cpp +++ b/lib/Serialization/Serialization.cpp @@ -3146,7 +3146,7 @@ class Serializer::DeclSerializer : public DeclVisitor { // A decl is safe if formally accessible publicly. auto accessScope = value->getFormalAccessScope(/*useDC=*/nullptr, /*treatUsableFromInlineAsPublic=*/true); - if (accessScope.isPublic()) + if (accessScope.isPublic() || accessScope.isPackage()) return true; if (auto accessor = dyn_cast(value)) diff --git a/test/Sema/package-only-references.swift b/test/Sema/package-only-references.swift index f29ba039ea493..af4461c8b04ec 100644 --- a/test/Sema/package-only-references.swift +++ b/test/Sema/package-only-references.swift @@ -17,6 +17,11 @@ // RUN: -package-name MyPackage -I %t \ // RUN: -enable-experimental-feature AccessLevelOnImport +// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t \ +// RUN: -package-name MyPackage -I %t \ +// RUN: -enable-deserialization-safety \ +// RUN: -enable-experimental-feature AccessLevelOnImport + /// A client outside of the package raises errors. // RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t \ // RUN: -package-name NotMyPackage -I %t \ diff --git a/test/Serialization/Safety/skip-reading-internal-details.swift b/test/Serialization/Safety/skip-reading-internal-details.swift index dcdda8b48b2c6..b6e7b53554595 100644 --- a/test/Serialization/Safety/skip-reading-internal-details.swift +++ b/test/Serialization/Safety/skip-reading-internal-details.swift @@ -18,6 +18,11 @@ // RUN: -disable-deserialization-safety 2>&1 \ // RUN: | %FileCheck --check-prefixes=NEEDED,UNSAFE %s +// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t \ +// RUN: -verify -Xllvm -debug-only=Serialization \ +// RUN: -disable-access-control 2>&1 \ +// RUN: | %FileCheck --check-prefixes=NEEDED,UNSAFE %s + // RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t \ // RUN: -verify -Xllvm -debug-only=Serialization \ // RUN: -enable-deserialization-safety 2>&1 \