Skip to content

Commit dde4311

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 9016c2c commit dde4311

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
@@ -2512,7 +2512,20 @@ usePrespecialized(SILOptFunctionBuilder &funcBuilder, ApplySite apply,
25122512
auto specializationAvail = SA->getAvailability();
25132513
auto &ctxt = funcBuilder.getModule().getSwiftModule()->getASTContext();
25142514
auto deploymentAvail = AvailabilityContext::forDeploymentTarget(ctxt);
2515-
auto currentFnAvailability = apply.getFunction()->getAvailabilityForLinkage();
2515+
auto currentFn = apply.getFunction();
2516+
auto isInlinableCtxt = (currentFn->getResilienceExpansion()
2517+
== ResilienceExpansion::Minimal);
2518+
auto currentFnAvailability = currentFn->getAvailabilityForLinkage();
2519+
2520+
// If we are in an inlineable function we can't use the specialization except
2521+
// the inlinable function itself has availability we can use.
2522+
if (currentFnAvailability.isAlwaysAvailable() && isInlinableCtxt) {
2523+
continue;
2524+
}
2525+
else if (isInlinableCtxt) {
2526+
deploymentAvail = currentFnAvailability;
2527+
}
2528+
25162529
if (!currentFnAvailability.isAlwaysAvailable() &&
25172530
!deploymentAvail.isContainedIn(currentFnAvailability))
25182531
deploymentAvail = currentFnAvailability;

0 commit comments

Comments
 (0)