Skip to content

Commit 158db2b

Browse files
authored
Merge pull request #83222 from tshortli/prefer-availability-context
Adopt `AvailabilityContext` in more places instead of `AvailabilityInference`
2 parents 3a28941 + c6a5dbb commit 158db2b

File tree

8 files changed

+56
-48
lines changed

8 files changed

+56
-48
lines changed

lib/AST/AvailabilityContext.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,23 @@ AvailabilityContext::forLocation(SourceLoc loc, const DeclContext *declContext,
211211
}
212212

213213
AvailabilityContext AvailabilityContext::forDeclSignature(const Decl *decl) {
214-
return forLocation(decl->getLoc(), decl->getInnermostDeclContext());
214+
// For decls with valid source locations, query the availability scope tree.
215+
auto loc = decl->getLoc();
216+
if (loc.isValid())
217+
return forLocation(loc, decl->getInnermostDeclContext());
218+
219+
// Otherwise, walk the decl hierarchy to compute availability. This can't be
220+
// delegated to `AvailabilityContext::forLocation()` since it walks up the
221+
// `DeclContext` hierachy for invalid source locations and that may skip
222+
// some declarations with availability attributes.
223+
auto &ctx = decl->getASTContext();
224+
auto availability = forInliningTarget(ctx);
225+
while (decl) {
226+
availability.constrainWithDecl(decl);
227+
decl = decl->parentDeclForAvailability();
228+
}
229+
230+
return availability;
215231
}
216232

217233
AvailabilityContext

lib/AST/DeclContext.cpp

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
#include "swift/AST/ASTContext.h"
1515
#include "swift/AST/ASTWalker.h"
1616
#include "swift/AST/AccessScope.h"
17-
#include "swift/AST/AvailabilityInference.h"
17+
#include "swift/AST/AvailabilityConstraint.h"
18+
#include "swift/AST/AvailabilityContext.h"
1819
#include "swift/AST/ClangModuleLoader.h"
1920
#include "swift/AST/DiagnosticsSema.h"
2021
#include "swift/AST/Expr.h"
@@ -1750,16 +1751,10 @@ bool DeclContext::isAlwaysAvailableConformanceContext() const {
17501751
if (ext == nullptr)
17511752
return true;
17521753

1753-
if (ext->isUnavailable())
1754-
return false;
1755-
1754+
// Check whether the extension is always available relative to the deployment
1755+
// target.
17561756
auto &ctx = getASTContext();
1757-
1758-
// FIXME: [availability] Query AvailabilityContext, not platform range.
1759-
AvailabilityRange conformanceAvailability{
1760-
AvailabilityInference::availableRange(ext)};
1761-
1762-
auto deploymentTarget = AvailabilityRange::forDeploymentTarget(ctx);
1763-
1764-
return deploymentTarget.isContainedIn(conformanceAvailability);
1757+
auto deploymentTarget = AvailabilityContext::forDeploymentTarget(ctx);
1758+
auto constraints = getAvailabilityConstraintsForDecl(ext, deploymentTarget);
1759+
return !constraints.getPrimaryConstraint();
17651760
}

lib/SILGen/SILGenConcurrency.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#include "RValue.h"
1616
#include "Scope.h"
1717
#include "swift/AST/ASTContext.h"
18-
#include "swift/AST/AvailabilityInference.h"
18+
#include "swift/AST/AvailabilityContext.h"
1919
#include "swift/AST/ConformanceLookup.h"
2020
#include "swift/AST/DistributedDecl.h"
2121
#include "swift/AST/ProtocolConformance.h"
@@ -778,9 +778,9 @@ static bool isCheckExpectedExecutorIntrinsicAvailable(SILGenModule &SGM) {
778778
// in main-actor context.
779779
auto &C = checkExecutor->getASTContext();
780780
if (!C.LangOpts.DisableAvailabilityChecking) {
781-
auto deploymentAvailability = AvailabilityRange::forDeploymentTarget(C);
781+
auto deploymentAvailability = AvailabilityContext::forDeploymentTarget(C);
782782
auto declAvailability =
783-
AvailabilityInference::availableRange(checkExecutor);
783+
AvailabilityContext::forDeclSignature(checkExecutor);
784784
return deploymentAvailability.isContainedIn(declAvailability);
785785
}
786786

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
#include "swift/AST/ASTWalker.h"
2525
#include "swift/AST/AvailabilityConstraint.h"
2626
#include "swift/AST/AvailabilityDomain.h"
27-
#include "swift/AST/AvailabilityInference.h"
2827
#include "swift/AST/AvailabilityScope.h"
2928
#include "swift/AST/AvailabilitySpec.h"
3029
#include "swift/AST/ClangModuleLoader.h"
@@ -3522,9 +3521,8 @@ static bool declNeedsExplicitAvailability(const Decl *decl) {
35223521
if (decl->isUnavailable())
35233522
return false;
35243523

3525-
// Warn on decls without an introduction version.
3526-
auto safeRangeUnderApprox = AvailabilityInference::availableRange(decl);
3527-
return safeRangeUnderApprox.isAlwaysAvailable();
3524+
// Warn on decls without a platform introduction version.
3525+
return !decl->getAvailableAttrForPlatformIntroduction();
35283526
}
35293527

35303528
void swift::checkExplicitAvailability(Decl *decl) {

lib/Sema/TypeCheckConcurrency.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,14 @@
1515
//===----------------------------------------------------------------------===//
1616

1717
#include "TypeCheckConcurrency.h"
18-
#include "NonisolatedNonsendingByDefaultMigration.h"
1918
#include "MiscDiagnostics.h"
19+
#include "NonisolatedNonsendingByDefaultMigration.h"
2020
#include "TypeCheckDistributed.h"
2121
#include "TypeCheckInvertible.h"
2222
#include "TypeCheckProtocol.h"
2323
#include "TypeCheckType.h"
2424
#include "TypeChecker.h"
2525
#include "swift/AST/ASTWalker.h"
26-
#include "swift/AST/AvailabilityInference.h"
2726
#include "swift/AST/Concurrency.h"
2827
#include "swift/AST/ConformanceLookup.h"
2928
#include "swift/AST/DistributedDecl.h"
@@ -1541,11 +1540,11 @@ void swift::tryDiagnoseExecutorConformance(ASTContext &C,
15411540
canRemoveOldDecls = true;
15421541
} else {
15431542
// Check if the availability of nominal is high enough to be using the ExecutorJob version
1544-
AvailabilityRange requirementInfo =
1545-
AvailabilityInference::availableRange(moveOnlyEnqueueRequirement);
1546-
AvailabilityRange declInfo =
1547-
AvailabilityContext::forDeclSignature(nominal).getPlatformRange();
1548-
canRemoveOldDecls = declInfo.isContainedIn(requirementInfo);
1543+
auto requirementAvailability =
1544+
AvailabilityContext::forDeclSignature(moveOnlyEnqueueRequirement);
1545+
auto nominalAvailability = AvailabilityContext::forDeclSignature(nominal);
1546+
canRemoveOldDecls =
1547+
nominalAvailability.isContainedIn(requirementAvailability);
15491548
}
15501549

15511550
auto concurrencyModule = C.getLoadedModule(C.Id_Concurrency);

lib/Sema/TypeCheckDeclObjC.cpp

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
#include "TypeChecker.h"
2121
#include "swift/AST/ASTContext.h"
2222
#include "swift/AST/ASTPrinter.h"
23-
#include "swift/AST/AvailabilityInference.h"
2423
#include "swift/AST/Decl.h"
2524
#include "swift/AST/ExistentialLayout.h"
2625
#include "swift/AST/ForeignErrorConvention.h"
@@ -553,32 +552,30 @@ static bool checkObjCActorIsolation(const ValueDecl *VD, ObjCReason Reason) {
553552
}
554553
}
555554

556-
static VersionRange getMinOSVersionForClassStubs(const llvm::Triple &target) {
555+
static AvailabilityRange getObjCClassStubAvailability(ASTContext &ctx) {
556+
// FIXME: This should just be ctx.getSwift51Availability(), but that breaks
557+
// tests on arm64 arches.
558+
const llvm::Triple &target = ctx.LangOpts.Target;
557559
if (target.isMacOSX())
558-
return VersionRange::allGTE(llvm::VersionTuple(10, 15, 0));
560+
return AvailabilityRange(llvm::VersionTuple(10, 15, 0));
559561
if (target.isiOS()) // also returns true on tvOS
560-
return VersionRange::allGTE(llvm::VersionTuple(13, 0, 0));
562+
return AvailabilityRange(llvm::VersionTuple(13, 0, 0));
561563
if (target.isWatchOS())
562-
return VersionRange::allGTE(llvm::VersionTuple(6, 0, 0));
564+
return AvailabilityRange(llvm::VersionTuple(6, 0, 0));
563565
if (target.isXROS())
564-
return VersionRange::allGTE(llvm::VersionTuple(1, 0, 0));
565-
return VersionRange::all();
566-
}
567-
568-
static AvailabilityRange getObjCClassStubAvailability(ASTContext &ctx) {
569-
// FIXME: This should just be ctx.getSwift51Availability(), but that breaks
570-
// tests on arm64 arches.
571-
return AvailabilityRange(getMinOSVersionForClassStubs(ctx.LangOpts.Target));
566+
return AvailabilityRange(llvm::VersionTuple(1, 0, 0));
567+
return AvailabilityRange::alwaysAvailable();
572568
}
573569

574570
static bool checkObjCClassStubAvailability(ASTContext &ctx, const Decl *decl) {
575-
auto stubAvailability = getObjCClassStubAvailability(ctx);
571+
auto stubAvailability = AvailabilityContext::forPlatformRange(
572+
getObjCClassStubAvailability(ctx), ctx);
576573

577-
auto deploymentTarget = AvailabilityRange::forDeploymentTarget(ctx);
574+
auto deploymentTarget = AvailabilityContext::forDeploymentTarget(ctx);
578575
if (deploymentTarget.isContainedIn(stubAvailability))
579576
return true;
580577

581-
auto declAvailability = AvailabilityInference::availableRange(decl);
578+
auto declAvailability = AvailabilityContext::forDeclSignature(decl);
582579
return declAvailability.isContainedIn(stubAvailability);
583580
}
584581

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
#include "swift/AST/ASTMangler.h"
3434
#include "swift/AST/ASTPrinter.h"
3535
#include "swift/AST/AccessScope.h"
36-
#include "swift/AST/AvailabilityInference.h"
3736
#include "swift/AST/ClangModuleLoader.h"
3837
#include "swift/AST/ConformanceLookup.h"
3938
#include "swift/AST/Decl.h"
@@ -6433,12 +6432,11 @@ static void inferStaticInitializeObjCMetadata(ClassDecl *classDecl) {
64336432
// only statically initialize the Objective-C metadata when running on
64346433
// a new-enough OS.
64356434
if (classDecl->getParentSourceFile()) {
6436-
AvailabilityRange safeRangeUnderApprox{
6437-
AvailabilityInference::availableRange(classDecl)};
6438-
AvailabilityRange runningOSOverApprox =
6435+
auto classAvailability = AvailabilityContext::forDeclSignature(classDecl);
6436+
AvailabilityRange deploymentTarget =
64396437
AvailabilityRange::forDeploymentTarget(ctx);
64406438

6441-
if (!runningOSOverApprox.isContainedIn(safeRangeUnderApprox))
6439+
if (!deploymentTarget.isContainedIn(classAvailability.getPlatformRange()))
64426440
return;
64436441
}
64446442

test/Profiler/unmapped.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ struct TypeWithUnavailableMethods {
4747
func foo() -> Int {
4848
.random() ? 1 : 2
4949
}
50+
51+
@available(*, unavailable)
52+
var qux: Int {
53+
.random() ? 1 : 2
54+
}
5055
}
5156

5257
@available(*, unavailable)

0 commit comments

Comments
 (0)