Merge pull request #74641 from swiftlang/elsh/cmo-ufi

This commit is contained in:
Ellie Shin
2024-06-26 09:06:39 -07:00
committed by GitHub
2 changed files with 81 additions and 0 deletions

View File

@@ -830,6 +830,21 @@ void CrossModuleOptimization::makeDeclUsableFromInline(ValueDecl *decl) {
if (decl->getEffectiveAccess() >= AccessLevel::Package)
return;
// FIXME: rdar://130456707
// Currently not all types are visited in canSerialize* calls, sometimes
// resulting in an internal type getting @usableFromInline, which is
// incorrect.
// For example, for `let q = P() as? Q`, where Q is an internal class
// inherting a public class P, Q is not visited in the canSerialize*
// checks, thus resulting in `@usableFromInline class Q`; this is not
// the intended behavior in the conservative mode as it modifies AST.
//
// To properly fix, instruction visitor needs to be refactored to do
// both the "canSerialize" check (that visits all types) and serialize
// or update visibility (modify AST in non-conservative modes).
if (isPackageCMOEnabled(M.getSwiftModule()))
return;
// We must not modify decls which are defined in other modules.
if (M.getSwiftModule() != decl->getDeclContext()->getParentModule())
return;