diff --git a/lib/SILOptimizer/IPO/CrossModuleOptimization.cpp b/lib/SILOptimizer/IPO/CrossModuleOptimization.cpp index 9ff9a7f638d00..22e2ed6f416ab 100644 --- a/lib/SILOptimizer/IPO/CrossModuleOptimization.cpp +++ b/lib/SILOptimizer/IPO/CrossModuleOptimization.cpp @@ -651,6 +651,21 @@ bool CrossModuleOptimization::canSerializeFieldsByInstructionKind( canUse = methodScope.isPublicOrPackage(); } }); + auto pattern = KPI->getPattern(); + for (auto &component : pattern->getComponents()) { + if (!canUse) { + break; + } + switch (component.getKind()) { + case KeyPathPatternComponent::Kind::StoredProperty: { + auto property = component.getStoredPropertyDecl(); + canUse = isPackageOrPublic(property->getEffectiveAccess()); + break; + } + default: + break; + } + } return canUse; } if (auto *MI = dyn_cast(inst)) { diff --git a/test/SILOptimizer/Inputs/cross-module/cross-module.swift b/test/SILOptimizer/Inputs/cross-module/cross-module.swift index 063fc76a2caa0..61f0a8d2877bf 100644 --- a/test/SILOptimizer/Inputs/cross-module/cross-module.swift +++ b/test/SILOptimizer/Inputs/cross-module/cross-module.swift @@ -311,3 +311,11 @@ public struct S { _ = (repeat (each storage).visit()) } } + +public struct StructWithInternal { + var internalVar: Int +} + +public func getKP() -> KeyPath { + return \StructWithInternal.internalVar +} diff --git a/test/SILOptimizer/cross-module-optimization.swift b/test/SILOptimizer/cross-module-optimization.swift index 5db9e40f0ce36..9001d8e66f216 100644 --- a/test/SILOptimizer/cross-module-optimization.swift +++ b/test/SILOptimizer/cross-module-optimization.swift @@ -171,6 +171,10 @@ func testPrivateVar() { print(getRandom()) } +func testKeyPathAccess() -> KeyPath { + return getKP() +} + testNestedTypes() testClass() testError() @@ -182,4 +186,4 @@ testMisc() testGlobal() testImplementationOnly() testPrivateVar() - +testKeyPathAccess()