Skip to content

Commit 4ecbfba

Browse files
committed
Don't use pre-specializations in inlinable functions.
because they need a minimum deployment target, which might not be available in client modules, which de-serialize such functions.
1 parent ce25df6 commit 4ecbfba

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

lib/SILOptimizer/Utils/Generics.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2496,7 +2496,20 @@ usePrespecialized(SILOptFunctionBuilder &funcBuilder, ApplySite apply,
24962496
auto specializationAvail = SA->getAvailability();
24972497
auto &ctxt = funcBuilder.getModule().getSwiftModule()->getASTContext();
24982498
auto deploymentAvail = AvailabilityContext::forDeploymentTarget(ctxt);
2499-
auto currentFnAvailability = apply.getFunction()->getAvailabilityForLinkage();
2499+
auto currentFn = apply.getFunction();
2500+
auto isInlinableCtxt = (currentFn->getResilienceExpansion()
2501+
== ResilienceExpansion::Minimal);
2502+
auto currentFnAvailability = currentFn->getAvailabilityForLinkage();
2503+
2504+
// If we are in an inlineable function we can't use the specialization except
2505+
// the inlinable function itself has availability we can use.
2506+
if (currentFnAvailability.isAlwaysAvailable() && isInlinableCtxt) {
2507+
continue;
2508+
}
2509+
else if (isInlinableCtxt) {
2510+
deploymentAvail = currentFnAvailability;
2511+
}
2512+
25002513
if (!currentFnAvailability.isAlwaysAvailable() &&
25012514
!deploymentAvail.isContainedIn(currentFnAvailability))
25022515
deploymentAvail = currentFnAvailability;

0 commit comments

Comments
 (0)